NativeScript で非 SSL サイトへのリクエストを許可
はじめに
NativeScript(NatvieScript-vue) で、非 SSL サイトへのリクエストを許可する方法。
TL;DR
- Android:
AndroidManifest.xml
にusesCleartextTraffic
の設定追加 - iOS:
Info.plist
にNSAllowsArbitraryLoads
の設定追加 - よりセキュアな方法もあるので、各自の状況や環境に合わせて要設定
目次
環境・条件
1 | $ sw_vers |
詳細
問題点
axios を使って、非 SSL の API Endpoint(ex: http://path/to/api
)へのリクエストを行ったところ、以下のように Request failed with status code null
となった。
Chrome の Console
1 | { |
Chrome の Network タブ
なお、Android エミュレータ上では問題なく動作したため、実機を使うフェーズになって初めて気付いた。
- Android エミュレータ: OK
- Android 実機: NG
- iOS エミュレータ: NG
- iOS 実機: NG
解決方法
javascript - How to call axios/api call in Nativescript application - Stack Overflow に書かれている通りに対応すれば良い。
Android は app/App_Resources/Android/src/main/AndroidManifest.xml
を編集。
1 | ... |
iOS は app/App_Resources/iOS/Info.plist
を編集。
1 | ... |
これらを編集後にビルドしたファイルで http へのリクエストが成功するのを確認できた。
簡単な解説
これらは NativeScript の問題ではなく、単に Android/iOS アプリ開発時の設定に起因する問題(というか事象)になる。
(ネイティブアプリ開発経験がある人からすれば当然の話になると思うが)
Android
以下が参考になる。
上記参考ページにも書かれている通り、今回の usesCleartextTraffic
で対応する方法以外にも network_security_config.xml
で詳細に設定する方法があるらしい。
ただし、 network_security_config.xml
は NativeScript がデフォルトで用意してくれないので、自前で作成する必要がある(はず)。
iOS
以下が参考になる。
今回は手っ取り早く NSAllowsArbitraryLoads
で全許容しているが、実際には NSExceptionDomains
と NSTemporaryExceptionAllowsInsecureHTTPLoads
とで設定する方法を用いた方がよりセキュア。
まとめ
- Android:
AndroidManifest.xml
にusesCleartextTraffic
の設定追加 - iOS:
Info.plist
にNSAllowsArbitraryLoads
の設定追加 - よりセキュアな方法もあるので、各自の状況や環境に合わせて要設定
参考文献
- javascript - How to call axios/api call in Nativescript application - Stack Overflow
- Android PでtargetSdkVersionを28に指定した場合にHTTP通信が失敗する - Qiita
- android:usesCleartextTraffic - Android Developers
- IOS9対応の問題解決方法まとめ - Qiita
- iOS9でHTTP通信ができない時の解決法 - Qiita
- NSAllowsArbitraryLoads - NSAppTransportSecurity | Apple Developer Documentation
- NSExceptionDomains - NSAppTransportSecurity | Apple Developer Documentation
関連記事
- NativeScript, JsBarcode でバーコードを 生成/描画
- NativeScript でデバイスの輝度(明るさ)を制御する
- NativeScript-Vue でネイテイブアプリの開発(チュートリアル + α)
- NativeScript-Vue で QRコードの読取り
- NativeScript で入力範囲外タップでキーボードを非表示にする
- NativeScript + Firebase でプッシュ通知
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア