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