たねやつの木

Photographs, Keyboards and Programming

【Cordova】net::ERR_CLEARTEXT_NOT_PERMITTEDの解決方法について

Android 9向けにCordovaで開発しているときに、HTTPリクエストを投げた時に以下のERR_CLEARTEXT_NOT_PERMITTEDエラーが発生してうまくいかない場合があります。

その対応方法についてです。

素のAndroidアプリを開発している場合は以下の記事が参考になると思います。

対策

config.xmlに追記

以下の内容をconfig.xmlに追加してあげます。これにより素のAndroidの開発をしているときにAndroidManifest.xmlに追記するのと同じような感じになります。

<platform name="android"></platform>
    <allow-intent href="market:*" />
    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
        <application android:usesCleartextTraffic="true" />
    </edit-config>
</platform>

<allow-intent />の部分はプラットフォームを追加した時からあると思いますので、その下に<edit-config ...を追加します。usesCleartextTrafficの設定値を真にすることでHTTP通信を許可するようにします。

以上を追加しただけでは以下のunbound prefixエラーが発生する場合があります。

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:mergeDebugResources'.
> java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource compilation failed
  C:\...\config.xml:25: error: unbound prefix.

その場合は同じくconfig.xmlを少し編集します。多分xmlns:androidの属性と値がないはずですので追加します。

<widget id="アプリのID"
        version="アプリのバージョン"
        xmlns="http://www.w3.org/ns/widgets"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:cdv="http://cordova.apache.org/ns/1.0">

これでビルドすると先ほどのunbound prefixが解消し、HTTPでリクエストを投げてもエラーとならずに成功します!

なぜ発生する?

Android 9(Pie)よりHTTPS通信がデフォルトとなりましたのでHTTP通信(http://...)を行うことができなくなりました。これによりhttp://...でリクエストを投げた時にエラーが発生します。それをコンフィグから許可するようにしています。

個人開発や小規模の開発だとHTTPS化の敷居がちょっと高いのでちょっと手間になりましたね🤔

参考

以下のサイトを参考にしました。