禁止向server.com发送明文http流量。

7

我的代码在Android KitKat上运行正常,但在Pie上运行时出现了io异常。

不允许向server.com发送明文http流量

我正在使用Volley进行服务器调用。


1
可能是因为您使用了非 HTTPS 连接,导致出现了问题。 - Vladyslav Matviienko
那么我该怎么办,由于捕获到了 io 异常,我无法从服务器获得任何响应。 - RIK
请尝试使用HTTPS连接到服务器。 - Vladyslav Matviienko
可能是[Android 8:不允许明文HTTP流量]的重复问题(https://dev59.com/w1cO5IYBdhLWcg3wWgU0)。 - Zoe stands with Ukraine
5个回答

15

第一步是理解为什么Google要强制使用HTTPS。您可以在开发人员页面上阅读更多相关信息。

至于如何解决,有两个选项:

1)使用HTTPS!

2)在您的XML文件夹中创建一个名为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>

然后在您的清单文件中添加此内容

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/security_config">

    </application>
</manifest> 

由于显而易见的原因,不建议采用第二个观点!


你正在尝试连接的确切链接是什么? - Zun
1
之后它在KitKat上也会抛出异常。 - RIK
不必添加信任锚点,您可以简单地添加一个带有子域名为true的域名,这是正确的方法。这样只允许特定的网站而不是整个系统。 - Abhishek Garg

9

简单解决方案:

在您的清单中添加以下行:

android:usesCleartextTraffic="true"

因为我在使用php页面的json api时遇到了同样的问题。

应该是这样的:

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

希望它能够运作。


3
如果您无法使用HTTPS选项,则可以使用网络安全配置XML文件。
<?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">192.168.1.100</domain>
            <domain includeSubdomains="true">http://example1.com</domain>
            <domain includeSubdomains="true">example1.com</domain>
        </domain-config>
    </network-security-config>

那么,您需要在Android清单文件的<application部分添加以下行,以便将其加入:
android:networkSecurityConfig="@xml/testing_security"

其他答案中提出了一些替代方案 - 我认为允许所有明文流量是不明智的,因为第三方库可能会危害您。最好明确定义主机目标,以最小化此不安全通信的影响。


控制特定的域名非常有意义。这是我的首选答案。 - big_m

1

解决方案

编辑你的 ► ’ network security_config.xml ’

添加一行 ► Domain.com 或者你的IP(12.34.456.78)

修改后会变成这样

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
           <domain includeSubdomains="true">Domain.com OR your IP(12.34.456.78)</domain>
           <domain includeSubdomains="true">localhost</domain>
    </domain-config>
</network-security-config>

1
在AndroidManifest.xml的应用程序元素中添加android:usesCleartextTraffic属性即可实现!在Xamarin Forms中,您可以通过在Android解决方案的AssemblyInfo.cs中添加以下内容来实现此目的。
// Because I only want this in development
#if DEBUG 
[assembly: Application(UsesCleartextTraffic = true)]
#endif

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