2

这是在使用支持库版本 28.0.0-rc01 的 Android P 上。

我已根据几个 SO 帖子遵循此问题的说明/解决方案:

如何解决 Android P DownloadManager 因“不允许到 127.0.0.1 的明文 HTTP 流量”而停止?

Android 8:不允许明文 HTTP 流量

和其他几个人一起。

问题是,即使 network-security-config base-config 将此值设置为 true,当我检查 NetworkSecurityPolicy.isCleartextTrafficPermitted 时,它也会返回 false。当导航到 WebView 中的非 https 页面时,这会导致 ERR_CLEARTEXT_NOT_PERMITTED 错误。

这是 AndroidManifest 的片段

<application
    ...
    android:supportsRtl="true"
    android:networkSecurityConfig="@xml/network_security_config"
    android:usesCleartextTraffic="true">

我已经尝试过使用“usesCleartextTraffic”、“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>

请注意,我已经尝试过使用和不使用“信任锚”。我确实有一个 prod AndroidManifest 和 network-security-config 以及一个调试版本。但是,两者都具有相同的设置(除系统外,调试还允许用户证书)。

我还通过检查 logcat 验证了正在读取安全策略。在这一点上,我很茫然,因为它似乎没有得到尊重。

任何帮助,将不胜感激。

4

2 回答 2

9

我只有:

android:usesCleartextTraffic="true" 

在清单中并删除network_security_config.xml。这似乎行得通!

于 2019-01-08T00:14:35.627 回答
7

出于某种原因,即使设置几乎相同,调试 AndroidManifest 和 network-security-config 也会导致问题——唯一的区别是调试版本还允许用户生成证书。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:networkSecurityConfig="@xml/network_security_config"
        tools:targetApi="n" />

</manifest>

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <base-config cleartextTrafficPermitted="true" >
           <trust-anchors>
               <!-- Trust user added CAs while debuggable only -->
               <certificates src="user" />
               <certificates src="system" />
           </trust-anchors>
        </base-config>
    </debug-overrides>
</network-security-config>

删除调试 AndroidManifest.xml 和 network_security_config.xml 文件解决了该问题。我仍然不确定为什么会这样,但无论如何我们不再需要调试清单,所以现在就继续吧。

于 2018-08-23T17:43:14.547 回答