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

Androidアプリ開発でhttpへアクセスできないネットワークエラー対処
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
<?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 属性を追加します:
xml
<application
    ...
    android:networkSecurityConfig="@xml/network_security_config"
    ...>
    ...
</application>

この設定により、指定したドメインに対してはクリアテキストトラフィックが許可されますが、セキュリティリスクがあるため、開発やテストの目的に限定し、本番環境ではHTTPSの使用が推奨されます。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事