Android 8:不允许明文HTTP流量

1686

我收到来自使用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)

在 Android 7 及以下版本上,一切正常。我没有在 Manifest 中设置 android:usesCleartextTraffic(将其设置为 true 也没有帮助,因为默认值就是这个),也没有使用网络安全信息。如果我调用 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(),它会返回 false(针对 Android 8),返回 true(针对旧版本),并且仍然使用同一个 apk 文件。 我试图在 Google 上寻找 Android O 相关的信息,但未获得成功。


6
由于服务器在某些情况下将HTTPS重定向到HTTP,导致我维护的应用程序出现了这种情况。 - Big McLargeHuge
请在此处查看:https://codechacha.com/android-cleartext-http-traffic-issue/ - ikmazameti
我正在构建API级别为30的Android 11应用程序,并在清单文件中的应用程序标记中添加android:usesCleartextTraffic="true"。 - masterxilo
据其他地方报道,直到Android 9才会发生这种情况。这对我来说是个新闻。 - undefined
37个回答

1
升级到React Native 0.58.5或更高版本。他们在RN 0.58.5的配置文件中有includeSubdomain

变更日志

在Rn 0.58.5中,他们声明了network_security_config与其服务器域名。网络安全配置允许应用程序允许来自某个域的明文流量。因此,在您的清单文件的应用程序标记中声明android:usesCleartextTraffic="true"不需要额外的努力。升级RN版本后,它将自动解决。

1
在apiSauce React Native中,在头部添加此参数解决了我的问题。
"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"

1

在API版本9.0之后更改后,在xamarin、xamarin.android和android studio中出现了错误Cleartext HTTP traffic to YOUR-API.DOMAIN.COM not permitted (targetSdkVersion="28")。

解决此错误的两个步骤在xamarin、xamarin.android和android studio中如下:

第一步:创建文件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>

第二步:更新AndroidManifest.xml -
在应用程序标签上添加android:networkSecurityConfig="@xml/network_security_config"。 例如:
<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">

0

尝试使用“https://”而不是“http://”访问URL。


这个问题完全归因于安全协议吗? - Michael Nelles
@Nelles,改变协议并不是正确的解决方案。服务器可能不支持SSL连接。 - Farid

0

我在我的简单 Webview 应用中遇到了相同的问题,因为我的 URL 是 http:// ,但当您将其改为 https:// 后,该错误得以解决。


这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - Hein

0

请检查您的network_security_config.xml中的域名是否正确。

在我的情况下,我使用了一个带有ionic cordova--external命令,这改变了域名。

解决方案1

删除--external

解决方案2

编辑network_security_config.xml中的域名

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">
       YOUR_DOMAIN (ex: localhost)
    </domain>
</domain-config>
</network-security-config>

-3

一行代码解决你的问题。我假设你将你的URL存储在myURL字符串中。添加这一行代码,问题就解决了。 myURL = myURL.replace("http", "https");


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接