从 Android 9 开始,Android 默认只允许通过 HTTPS 进行网络连接。然而,我正在做的唯一请求是通过本地主机(例如http://10.41.199.226:port/FooBar
)完成的,该本地主机由(C#)处理,HttpListener
侦听该地址:端口组合。
由于此请求是通过 HTTP 发出的,Android 默认情况下不允许它。按照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 清单中使用android:networkSecurityConfig="@xml/network_security_config"
.
这允许完成 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>
这行得通,只有在通过 localhost 请求时才允许 HTTP,而任何传出请求都需要 HTTPS。
唯一的问题是我无法知道在应用程序启动之前运行应用程序的设备的本地 IP。
所以我的问题是,有没有办法:
- 将域名设置为会自动注册为本地 ip 的名称?(就像
localhost
我尝试过的那样,但是没有用) - 添加一个“通配符”IP 地址,它将接受 10.xxx 范围内的任何 IP(我希望
includeSubdomains="true"
在添加地址时设置会为我执行此操作10.0.0.0
。但事实并非如此) - 作为最后的手段,是否可以
network_security_config.xml
在运行时编辑文件,以便在启动应用程序时将其中一个域条目的域名动态更新为当前本地 ip?
该应用程序是使用 Unity 2019.1.8 使用 .net 4.x IL2CPP 脚本运行时开发的