私は自分のアプリ(バックエンドフィードを使う)がコンテンツを表示しないとAndroid 8のユーザーからの報告を受けました。調査の結果、私はAndroid 8で以下の例外が発生していることを発見しました。
08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException Java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.Android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.Java:115)
at com.Android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.Java:458)
at com.Android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.Java:127)
at com.deiw.Android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.Java:207)
at com.deiw.Android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.Java:102)
at com.deiw.Android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.Java:88)
at Android.os.AsyncTask$2.call(AsyncTask.Java:333)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at Android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.Java:245)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1162)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:636)
at Java.lang.Thread.run(Thread.Java:764)
(パッケージ名、URL、その他の識別子を削除しました)
Android 7以下では、ManifestでAndroid:usesCleartextTraffic
を設定していません(そしてtrue
に設定しても意味がありません)。ネットワークセキュリティ情報も使用しません。 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
を呼び出した場合、同じapkファイルを使用して、Android 8の場合はfalse
、古いバージョンの場合はtrue
が返されます。私はAndroid Oに関するGoogleの情報でこれについての言及を見つけようとしましたが、成功しませんでした。
ネットワークセキュリティ設定 - に従って
Android 9.0(APIレベル28)以降、クリアテキストサポートはデフォルトで無効になっています。
また見て - https://koz.io/Android-m-and-the-war-on-cleartext-traffic/
オプション1 -
ファイルres/xml/network_security_config.xmlを作成します -
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission Android:name="Android.permission.INTERNET" />
<application
...
Android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
オプション2 -
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission Android:name="Android.permission.INTERNET" />
<application
...
Android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
また @ david.s 'answer が指摘したようにAndroid:targetSandboxVersion
も問題になる可能性があります -
によると、{ Manifest Docs -
Android:targetSandboxVersion
このアプリが使用するターゲットサンドボックス。サンドボックスのバージョン番号が高いほど、セキュリティレベルが高くなります。デフォルト値は1です。 2に設定することもできます。この属性を2に設定すると、アプリは別のSELinuxサンドボックスに切り替わります。次の制限事項がレベル2サンドボックスに適用されます。
- Network Security Configの
usesCleartextTraffic
のデフォルト値はfalseです。- UID共有は許可されていません。
だからオプション3 -
Android:targetSandboxVersion
に<manifest>
がある場合は、それを1
に減らします。
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest Android:targetSandboxVersion="1">
<uses-permission Android:name="Android.permission.INTERNET" />
...
</manifest>
AndroidManifestでは、このパラメータを見つけました。
Android:networkSecurityConfig="@xml/network_security_config"
@ xml/network_security_configはnetwork_security_config.xmlで次のように定義されています。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--Set application-wide security config using base-config tag.-->
<base-config cleartextTrafficPermitted="false"/>
</network-security-config>
ちょうど私はcleartextTrafficPermittedをtrueに変更しました
デバッグ時にはクリアテキストのみを許可することをお勧めしますが、プロダクションではクリアテキストを拒否することによるセキュリティ上の利点を維持します。 httpsをサポートしていない開発サーバーに対してアプリをテストしているので、これは私にとって便利です。 httpsを運用環境で強制する方法は以下のとおりですが、デバッグモードではクリアテキストを許可します。
build.gradleの場合:
// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]
// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]
AndroidManifest.xmlのアプリケーションタグ内
Android:usesCleartextTraffic="${usesCleartextTraffic}"
URLをHTTP
からHTTPS
に変更します。
それはうまくいきます!
誰かに役立つかもしれません。
私たちは最近Android 9でも同じ問題を抱えていましたが、WebView内にいくつかのURLを表示するだけでよく、特別なことは何もありませんでした。マニフェストにAndroid:usesCleartextTraffic="true"
を追加してもうまくいきましたが、このためにアプリ全体のセキュリティを犠牲にしたくはありませんでした。そのため、修正はリンクをhttp
からhttps
に変更することでした。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
</domain-config>
</network-security-config>
上記の提案では、URLをhttp://xyz.abc.com/mno/のように指定していました。
私はそれを xyz.abc.com に変更し、それからそれは働き始めました。
OK、つまり⇒⇒NOT NOTを何千回も繰り返してマニフェストに追加しますこれに基づいたヒント。ただし、追加のメリット(およびおそらく背景情報)を提供します。
Androidには、src-Directory用の一種の上書き機能があります。
デフォルトでは、
/ app/src /main
ただし、AndroidManifest.xmlを上書きするディレクトリを追加できます。仕組みは次のとおりです。
このファイル内では、すべてのルールを内部に配置する必要はありません。ただし、overwriteから好きなもののみ/app/src/main/AndroidManifest.xml
リクエストされたCLEARTEXT-Permissionの例は次のとおりです。
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.yourappname">
<application
Android:usesCleartextTraffic="true"
Android:name=".MainApplication"
Android:label="@string/app_name"
Android:icon="@mipmap/ic_launcher"
Android:allowBackup="false"
Android:theme="@style/AppTheme">
</application>
</manifest>
この知識があれば、あなたのdebugに応じてパーミッションをオーバーロードするのが1,2,3のように簡単になりました。メイン| release環境。
それの大きな利点...あなたはあなたのプロダクションマニフェストにデバッグスタッフを持っていません、そしてあなたはまっすぐで簡単に維持可能な構造を保ちます
私の問題 - アンドロイド9 httpでドメインを越えたウェブビューでナビゲートしていた/ /からの解決策 - / この答え
<application
Android:networkSecurityConfig="@xml/network_security_config"
...>
そして:
res/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>
さて、私はこれを考え出しました。これは、私たちがインスタントアプリバージョンも持っているので追加したマニフェストパラメータAndroid:targetSandboxVersion="2"
によるものです - インスタントアプリから通常のアプリにユーザーが一度アップグレードすると、彼は転送でデータを失うことはありません。しかし曖昧な説明が示唆するように:
このアプリが使用するターゲットサンドボックスを指定します。サンボックスのバージョンが高いほど、セキュリティレベルが上がります。
この属性のデフォルト値は1です。
少なくともAndroid 8では、明らかに新しいレベルのセキュリティポリシーも追加されています。
Reactネイティブプロジェクトの場合
RN 0.59で修正済みです。 upgrade diffを0.58.6から0.59にアップグレードできます。 アップグレードしなくても適用できます。
ファイルを作成します。
Android/app/src / デバッグ / res/xml/react_native_config.xml -
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="false">localhost</domain>
<domain includeSubdomains="false">10.0.2.2</domain>
<domain includeSubdomains="false">10.0.3.2</domain>
</domain-config>
</network-security-config>
Android/app/src / デバッグ / AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools">
<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/>
<application tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning"
Android:networkSecurityConfig="@xml/react_native_config" />
</manifest>
根本的な原因を知るために受け入れられた回答をチェックしてください。
URLをHTTPからHTTPSに変更します。
これらのさまざまな答えをXamarin.Android
に適用するには、手動でAndroidManifest.xml
を編集するのではなく、クラスおよびアセンブリレベルの属性を使用できます。
もちろんインターネットの許可が必要です(当たり前):
[Assembly: UsesPermission(Android.Manifest.Permission.Internet)]
注:通常、アセンブリレベルの属性はAssemblyInfo.cs
ファイルに追加されますが、using
の下およびnamespace
の上の任意のファイルが機能します。
次に、Applicationサブクラス(必要に応じて作成)で、Resources/xml/ZZZZ.xml
ファイルへの参照を含むNetworkSecurityConfig
を追加できます。
#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
public App() { }
public override void OnCreate()
{
base.OnCreate();
}
}
Resources/xml
フォルダーにファイルを作成します(必要に応じてxml
フォルダーを作成します)。
xml/network_security_config
ファイルの例、必要に応じて調整します(他の回答を参照)
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">www.example.com</domain>
<domain includeSubdomains="true">notsecure.com</domain>
<domain includeSubdomains="false">xxx.xxx.xxx</domain>
</domain-config>
</network-security-config>
UsesCleartextTraffic
にApplicationAttribute
パラメータを使用することもできます。
#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
アプリケーションの開発中にも、同じ「クリアテキストHTTPトラフィックは許可されていません」というエラーが表示されます。アプリケーションのネットワーク呼び出しにRetrofit2を使用しており、2つのプロジェクト環境(開発および本番)があります。私の本番ドメインはHTTPS呼び出しでSSL証明書を持っているため、開発者はhttpsを持っていません。構成はビルドフレーバーに追加されます。しかし、devに変更すると、この問題が発生します。そこで、そのためのソリューションを追加しました。
マニフェストにクリアテキストトラフィックを追加しました
Android:usesCleartextTraffic="true"
次に、レトロフィット構成クラスOKHttpの作成時に接続仕様を追加しました。
.connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
OkHttpClientの完全な作成を以下に示します
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.cache(null)
.connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
.addInterceptor(new NetworkInterceptor(context))
.addInterceptor(createLoggingInterceptor())
.addInterceptor(createSessionExpiryInterceptor())
.addInterceptor(createContextHeaderInterceptor())
.build();
React Native 0.58.5以降のバージョンにアップグレードしてください。 RN 0.58.5の設定ファイルにはincludeSubdomain
があります。
Rn 0.58.5では、彼らは自分のサーバドメインでnetwork_security_config
を宣言しました。ネットワークセキュリティ設定により、アプリは特定のドメインからのクリアテキストトラフィックを許可できます。そのため、マニフェストファイルのapplicationタグにAndroid:usesCleartextTraffic="true"
を宣言することで、余分な労力を費やす必要はありません。 RNバージョンをアップグレードすると自動的に解決されます。
APIバージョン9.0を変更した後、Your-API.DOMAIN.COMへのエラーCleartext HTTPトラフィックを取得できません(targetSdkVersion = "28")。 xamarin、xamarin.AndroidおよびAndroid studioで。
Xamarin、xamarin.AndroidおよびAndroid studioでこのエラーを解決する2つのステップ。
ステップ1:ファイルresources/xml/network_security_config.xmlを作成する
Network_security_config.xmlで
<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">mobapi.3detrack.in</domain>
</domain-config>
</network-security-config>
ステップ2:AndroidManifest.xmlを更新する-
アプリケーションタグにAndroid:networkSecurityConfig = "@ xml/network_security_config"を追加します。例えば:
<application Android:label="your App Name" Android:icon="@drawable/icon" Android:networkSecurityConfig="@xml/network_security_config">
私の場合、そのURLはブラウザーでも機能していません。
https://www.google.com/ で確認します
webView.loadUrl("https://www.google.com/")
そしてそれは私のために働いた。