1

从 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。

所以我的问题是,有没有办法:

  1. 将域名设置为会自动注册为本地 ip 的名称?(就像localhost我尝试过的那样,但是没有用)
  2. 添加一个“通配符”IP 地址,它将接受 10.xxx 范围内的任何 IP(我希望includeSubdomains="true"在添加地址时设置会为我执行此操作10.0.0.0。但事实并非如此)
  3. 作为最后的手段,是否可以network_security_config.xml在运行时编辑文件,以便在启动应用程序时将其中一个域条目的域名动态更新为当前本地 ip?

该应用程序是使用 Unity 2019.1.8 使用 .net 4.x IL2CPP 脚本运行时开发的

4

3 回答 3

6

实现这一点的简单方法是在您的 AndroidManifest.xml 中使用此属性,您可以在其中允许所有请求的所有 http:

android:usesCleartextTraffic="true"

但是,如果您想为不同的链接进行更多配置,例如,允许某些域使用 http 但不允许其他域使用,您必须提供networkSecurityConfigfile.

要在 Android 9 Pie 中执行此操作,您必须networkSecurityConfig在 Manifestapplication标签中设置一个,如下所示:

<?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

于 2020-01-20T04:51:01.457 回答
0

尝试 10.0.2.2 而不是 localhost。这个对我有用。 资源

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">10.0.2.2</domain>
    </domain-config>
</network-security-config>
于 2020-10-16T10:58:12.490 回答
0

尝试这个

     //in AndroidManifest.xml
    <application
    android:networkSecurityConfig="@xml/network_security_config">
    .
    </application>



<?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>
于 2021-02-17T12:36:06.193 回答