如何在Android(9)Pie中允许所有网络连接类型HTTP和HTTPS?


144

从现在的Android 9 Pie开始,没有加密的请求将永远无法使用。默认情况下,系统会期望您默认使用TLS。您可以在此处阅读此功能,因此,如果仅通过HTTPS发出请求,则将是安全的。但是,通过不同站点发出请求的应用程序(例如类似浏览器的应用程序)呢?

如何在Android 9 Pie中启用对所有类型的连接HTTP和HTTPS的请求?

Answers:


250

实现此目的的简单方法是AndroidManifest.xml在允许http所有请求全部使用的位置使用此属性:

<application android:usesCleartextTraffic="true">
</application>

但是,例如,如果您想为不同的链接进行更多配置,从而允许http某些域但不允许其他域,则必须提供res/xml/networkSecurityConfig.xml文件。

要在Android 9 Pie中执行此操作,您必须networkSecurityConfig在Manifest 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>

从那里出发,您一切顺利。现在,您的应用将请求所有类型的连接。有关此主题的更多信息,请单击此处


1
@Xenolion(使用React Native应用程序)进行了这些更改之后,它不再构建。“清单合并未成功”。“来自AndroidManifest.xml:7:7-67的属性application @ networkSecurityConfig值=(@ xml / react_native_config)也出现在AndroidManifest.xml:7:7-67值=(@ xml / network_security_config)。有什么想法吗?
Wyatt

@Wyatt im与您有相同的问题,您找到任何解决方案了吗?
Dante Cervantes

1
@DanteCervantes在上面查看我的答案。
Harshit Agrawal

3
我在哪里可以找到
React

2
浪费大量时间弄清楚这实际上是HTTP问题。通常它示出了HTTP响应误差
米希尔巴特

30

面向所有人AndroidReact-native面临此问题的用户的完全解决方案,只需将其添加 android:usesCleartextTraffic="true"AndroidManifest.xml文件中,如下所示:

android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

<application>.. </application>标签之间,如下所示:

<application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        tools:ignore="GoogleAppIndexingWarning">
        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"/>
 </application>

2
哇,感谢它在我的应用程序中的正常运行,在此之前解决了显示出的I / O故障问题
Venkatesh

1
如果你得到tools:ignore错误,请一定要加xmlns:tools="http://schemas.android.com/tools"你的里面application。像这样<application xmlns:tools="http://schemas.android.com/tools" ...
Ziyo

2
我知道这是一个Android问题,但可能对本地开发人员有所帮助,iOS解决方案是添加NSAppTransportSecurity到info.plist。stackoverflow.com/questions/38418998/...
阿卜杜勒·萨迪克亚尔钦

16

一个简单的方法设置android:usesCleartextTraffic="true"在你身上AndroidManifest.xml

android:usesCleartextTraffic="true"

AndroidManifest.xml看起来像

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.dww.drmanar">
   <application
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:usesCleartextTraffic="true"
       android:theme="@style/AppTheme"
       tools:targetApi="m">
       <activity
            android:name=".activity.SplashActivity"
            android:theme="@style/FullscreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
       </activity>
    </application>
</manifest>

我希望这能帮到您。


10

简单的方法

添加usesCleartextTrafficAndroidManifest.xml

<application
...
android:usesCleartextTraffic="true"
...>

指示应用程序是否打算使用明文网络流量,例如明文HTTP。目标API 级别为27或更低的应用程序的默认值为“ true”。目标API 级别为28或更高的应用程序默认为“ false”。


8

只需usesCleartextTrafficAndroidManifest.xml文件的应用程序标记中设置标志。无需为Android创建配置文件。

 <application
   android:usesCleartextTraffic="true"
   .
   .
   .>

7

对于React Native在调试中运行的应用程序,将xml block@Xenolion提及的内容添加到react_native_config.xml位于<project>/android/app/src/debug/res/xml

与以下代码段相似:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="false">localhost</domain>
        <domain includeSubdomains="false">10.0.2.2</domain>
        <domain includeSubdomains="false">10.0.3.2</domain>
    </domain-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

1

我遇到了同样的问题,并且我注意到我的安全配置具有不同的标记,例如@Xenolion回答说

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </domain-config>
</network-security-config>

所以我将标签“ domain-config”更改为“ base-config”并工作,如下所示:

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </base-config>
</network-security-config>


0

您可以检查是否通过HTTP Fix发送clearText:https ://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6

对于Apache HTTP客户端弃用(来自Google):在Android 6.0中,我们删除了对Apache HTTP客户端的支持。从Android 9开始,该库已从bootclasspath中删除,并且默认情况下不适用于应用程序。要继续使用Apache HTTP客户端,面向Android 9及更高版本的应用可以将以下内容添加到其AndroidManifest.xml中:

来源 https://developer.android.com/about/versions/pie/android-9.0-changes-28

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.