Androidアプリ開発でhttpへアクセスできないネットワークエラー対処

エラー: CLEARTEXT communication to xxxxxxxxx not permitted by network secunity policy
例えば、次のようなRetrofitでHTTPリクエストした時に、サーバーへ接続できないエラーが発生しました。エラーメッセージは
CLEARTEXT communication to xxxxxxxxx not permitted by network secunity policy
となっております。
try {
val request = ProductInfoRequest(epc_code = epcTag)
val response: Response<ProductInfo> = RetrofitClient.productService.getProductInfo(request)
.d("mopi", "response: $response")
Logif (response.isSuccessful && response.body() != null) {
// HTTPステータスコードが200~299の範囲にある場合、かつbodyがnullでない場合の処理
...
} else {
// APIからのレスポンスが失敗か、bodyがnullの場合
// 適切なエラーハンドリングをここに追加
.e("mopi", "商品情報の取得に失敗しました。 ${response.errorBody()?.string()}")
Log.value = "商品情報の取得に失敗しました。"
_errorMessage}
} catch (e: Exception) {
// その他のエラーのハンドリング
.e("mopi", "サーバーへアクセスできません。${e.message}")
Log// ユーザーへのエラー通知や、UIの更新などを行う
.value = "サーバーへアクセスできません。"
_errorMessage}
実は、Android 9 (API レベル 28) 以降、デフォルトのネットワークセキュリティポリシーは、アプリがクリアテキストのトラフィックを使用してネットワーク通信を行うことを禁止しています。そのため、httpsではアクセス可能ですが、httpではアクセス制限されるというものです。
次の対策を行うことで、httpでもアクセス可能になります。
ネットワークセキュリティ設定を変更する
res/xml`` ディレクトリに
network_security_config.xml`ファイルを作成します。 以下の内容を
network_security_config.xml`
に追加します:
<?xml version="1.0" encoding="utf-8"?>
network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<trust-anchors>
</base-config>
</network-security-config> </
AndroidManifest.xml
ファイルで、アプリケーションタグに
networkSecurityConfig
属性を追加します:
application
<...
android:networkSecurityConfig="@xml/network_security_config"
...>
...application> </
この設定により、指定したドメインに対してはクリアテキストトラフィックが許可されますが、セキュリティリスクがあるため、開発やテストの目的に限定し、本番環境ではHTTPSの使用が推奨されます。
関連記事
- FlaskアプリケーションをGunicornのWSGIサーバーで運用する方法|macOS
- Androidアプリ開発で、署名付きapkをdebugビルドで作成する手順
- Composerを使ってGuzzle HTTPクライアントをインストール、HTTPリクエストしてみた
- ESP32でHTTPSアクセス、ただし証明書検証なし
- たった数行で作るWebサーバー【Python x HTTPServer】