自Android 9起,默认情况下,Android仅允许通过HTTPS进行网络连接。但是,我正在执行的唯一请求是通过本地主机(例如http://10.41.199.226:port/FooBar
)完成的,该本地主机由(C#)HttpListener
收听该地址:端口组合。
由于此请求是通过HTTP发出的,因此默认情况下,Android不允许。关于Android this documentation文件,Android跟随network_security_config
,我可以通过添加以下network_security_config.xml
文件来允许HTTP连接
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
[使用android:networkSecurityConfig="@xml/network_security_config"
从Android清单中调用。
这允许完成HTTP请求,但是,因为这设置了基本配置,所以它允许在整个应用程序中发出HTTP请求。看到我将来可能想要添加传出请求(这是我希望通过HTTPS并希望为此使用的安全网),这不是一个好主意。禁止这样做。
在同一文档中,他们进一步介绍了domain-config
,可让您根据域设置cleartextTrafficPermitted
,我尝试使用以下域设置
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">127.0.0.1</domain>
<domain includeSubdomains="true">10.0.0.1</domain>
<domain includeSubdomains="true">localhost</domain>
</domain-config>
</network-security-config>
没有结果,由于没有使用https,请求仍然被阻止。
我查找了设备的本地地址,并将其添加到域列表中
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10.41.199.226</domain> <!--assume this is my local ip -->
</domain-config>
这有效,并且仅当通过本地主机请求时才允许使用HTTP,而任何传出请求都需要HTTPS。
唯一的问题是,在启动应用程序之前,我无法知道将运行该应用程序的设备的本地ip。
所以我的问题是,有两种方法可以吗:
localhost
,但没有用)includeSubdomains="true"
会在添加10.0.0.0
地址时为我完成此操作。但这不是)network_security_config.xml
文件,因此在启动应用程序时,我可以将一个域名条目的域名动态更新为当前的本地ip? [该应用是使用Unity 2019.1.8通过.net 4.x IL2CPP脚本运行时开发的
实现此目的的简单方法是对AndroidManifest.xml使用此属性,在该属性中,所有请求都允许使用所有http:
android:usesCleartextTraffic="true"
但是,例如,如果您想为不同的链接进行更多配置,允许在某些域而不是其他域中使用http,则必须提供networkSecurityConfig
文件。
要在Android 9 Pie中执行此操作,您必须像这样在清单networkSecurityConfig
标签中设置一个application
:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
</application>
</manifest>
然后,您现在必须在xml文件夹中创建一个名为network_security_config的文件,就像在清单中命名该文件的方式一样,从那里开始,文件内容应像这样,以启用所有不加密的请求:
<?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>
您从那里出发。现在,您的应用程序将请求所有类型的连接。有关此主题的其他信息https://developer.android.com/training/articles/security-config。