したいこと
AndroidからHTTPアクセスをしたい
たまにはHTTPアクセスも重要というわけではなく、
SORACOMのSIMを使った メタデータサービス や SORACOM Harvest など、
HTTPでないとアクセスできないサービスがあり、それをAndroidアプリから使うための方法です。
自宅のローカルサーバやなどWebサイトを構築して、ブラウザからHTTPアクセスする場合は
特に注意せずとも、URLを打ち込んで問題なくアクセスできます。
もちろん、ブラウザを使えばSORACOMのサービスへHTTPアクセスをすることも可能です。
(ブラウザからSORACOMのメタデータサービス用のURLにアクセスしたところ、問題なく情報が取得できます。)
しかし、アプリ内からアクセスしようとするとエラーになります。
ハマったところ
Android + React Nativeでアプリを構築中、
デバッグも一通り終わり、最後にリリースビルドし、APKを作成しました。
そのAPKをAndroid13のスマートフォンにインストールして起動したところ、
エラーが発生したという流れです。
原因
Android 9以降の仕様で、HTTPアクセスが無効化されるようになりました。
SORACOMのサービスにアプリ内から接続するには
前提
今回は、SORACOM メタデータサービスへの接続をできるようにするまでを記載します。
他のHarvestやFuncなどへも同じような方法で指定できます。
アプリのビューおよび動作自体はReact Nativeで構築していますが、
今回の設定はAndroid側でのものとなるので、ネイティブAndroidで構築されている方にも
参考にしていただけると思います。
参考にさせていただいたサイト
設定方法
-
(React Native向け)プロジェクト内のandroidディレクトリをAndroid Studioで開く
-
(project root) > app > res > xml
に、network_security_config.xmlを作成する -
作成したXMLファイルに以下のように編集する
network_security_config.xml<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">metadata.soracom.io</domain> </domain-config> </network-security-config>
こうすることでmetadata.soracom.io、つまりメタデータサービスへのHTTPアクセスが許可される。
他にもアクセスしたいドメインを追加することで、その通信は許可されるようになる。 -
設定を反映するために、AndroidManifest.xmlを開き、以下のように編集
AndroidMainifest.xml<application android:name=".MainApplication" android:networkSecurityConfig="@xml/network_security_config" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" /> </activity> </application>
-
リリースビルド
-
APKをスマホへインストール
まとめ
このような設定でSORACOMへのHTTPアクセスができるようになりました。
最近の(だいぶ前からの)流れで、非セキュアな通信はそもそも許可しない、
必要なものだけしか許可しないというようなものになってきているみたいです。
10/17追記
この設定だと、WiFiデバッグをしたいときにうまくデバッグアプリの起動ができません!
SORACOM等へのHTTPアクセスを許可しつつ、WiFiデバッグもしたい場合は以下の記事を参考にしてください。