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

Posted

技术标签:

【中文标题】Android(9)Pie中如何允许所有网络连接类型HTTP和HTTPS?【英文标题】:How to allow all Network connection types HTTP and HTTPS in Android (9) Pie? 【发布时间】:2019-01-24 22:10:16 【问题描述】:

从现在的 android 9 Pie 开始,没有加密的请求将永远无法工作。默认情况下,系统会期望您默认使用 TLS。You can read this feature here 因此,如果您只通过 HTTPS 发出请求,那么您是安全的。但是,通过不同站点发出请求的应用程序呢,例如类似浏览器的应用程序。

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

从那里你很高兴。现在,您的应用将对所有类型的连接发出请求。有关此主题的更多信息read here。

【讨论】:

@Xenolion 在我进行了这些更改(使用 React Native 应用程序)之后,它不再构建。 “清单合并不成功”。 “AndroidManifest.xml:7:7-67 中的属性 application@networkSecurityConfig value=(@xml/react_native_config) 也出现在 AndroidManifest.xml:7:7-67 value=(@xml/network_security_config) 中。有什么想法吗?跨度> @Wyatt 我和你有同样的问题,你找到解决办法了吗? @DanteCervantes 看看我上面的回答。 React Native 项目中的 xml 文件夹在哪里可以找到 浪费大量时间弄清楚这实际上是 HTTP 问题。通常它会在 HTTP RESPONSE 上显示 ERROR【参考方案2】:

完全有效的解决方案适用于面临此问题的 AndroidReact-native 用户只需添加此 android:usesCleartextTraffic="true"AndroidManifest.xml 文件中像这样:

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

&lt;application&gt;..&lt;/application&gt;标签之间是这样的:

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

【讨论】:

哇,感谢它在我的应用程序中运行良好,在它显示 i/o 故障问题现在解决之前 如果您收到tools:ignore 错误,请确保在您的application 中添加xmlns:tools="http://schemas.android.com/tools"。像这样&lt;application xmlns:tools="http://schemas.android.com/tools" ... 我知道这是一个 android 问题,但可能对 react-native 开发人员有所帮助,ios 解决方案是将NSAppTransportSecurity 添加到 info.plist。 ***.com/questions/38418998/… @HarshitAgrawal 我仍然无法在 React Native App 中下载 pdf 文件(具有 http url)。不过,https url 工作正常。我尝试添加android:usesCleartextTraffic="true"uses-library 部分,但仍然没有运气:( @NarendraSingh 尝试检查pdf url是否有效,并使用react-native-fs访问app的文件系统以下载pdf。【参考方案3】:

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

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>

希望对你有帮助。

【讨论】:

在@Mehul Solanki 的帮助下,我在 2021 年 5 月 14 日遇到了同样的问题。问题已解决。【参考方案4】:

简单方法

usesCleartextTraffic 添加到AndroidManifest.xml

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

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

【讨论】:

【参考方案5】:

对于在调试中运行的React Native 应用程序,将@Xenolion 提到的xml block 添加到位于&lt;project&gt;/android/app/src/debug/res/xmlreact_native_config.xml

类似于下面的sn-p:

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

【讨论】:

它在颤动时抛出异常E/flutter (19798): [ERROR:flutter/shell/common/shell.cc(209)] Dart Unhandled Exception: Invalid argument (domain): Invalid domain name: "localhost", stack trace: #0 new _DomainNetworkPolicy (dart:io/network_policy.dart:85:7) 它现在对我有用 谢谢...顺便说一句,我正在使用 React Natice 这对我有用,包括 React Native 60.6、Android 10、Gradle 3.4.3...如果在模拟器中运行并且您仍然无法连接到打包服务器,请在终端中尝试 adb reverse tcp:8081 tcp:8081 (假设 8081 是端口 Metro 捆绑器正在运行)【参考方案6】:

只需在AndroidManifest.xml 文件的应用程序标签中设置usesCleartextTraffic 标志。 无需为 Android 创建配置文件。

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

【讨论】:

【参考方案7】:

我遇到了同样的问题,我注意到我的安全配置有不同的标签,就像@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>

【讨论】:

你能回答这个***.com/questions/59116787/…【参考方案8】:

这对我有用,

将此 xml 文件添加到: andriod/app/src/main/res/xml/network_security_config.xml

network_security_config.xml

xml/network_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>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">your_domain1</domain>
    </domain-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">your_domain2</domain>
    </domain-config>
</network-security-config>

然后将此代码添加到 AndroidMenifest.xml

<application
    ...
      android:usesCleartextTraffic="true"
      android:networkSecurityConfig="@xml/network_security_config"
    ...
      >
      <!-- for http support-->
      <uses-library android:name="org.apache.http.legacy" android:required="false"/>
      ...
</application>
        

【讨论】:

【参考方案9】:

您可以检查您是否通过 HTTP 发送明文 修复:https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6 或 在 Apache HTTP 客户端弃用的情况下(来自 Google): 在 Android 6.0 中,我们移除了对 Apache HTTP 客户端的支持。从 Android 9 开始,该库已从引导类路径中移除,并且默认情况下不适用于应用。 要继续使用 Apache HTTP 客户端,面向 Android 9 及更高版本的应用可以将以下内容添加到其 AndroidManifest.xml:

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

【讨论】:

以上是关于Android(9)Pie中如何允许所有网络连接类型HTTP和HTTPS?的主要内容,如果未能解决你的问题,请参考以下文章

看完Andoird9.0 Pie的隐藏特性,我买了SSL证书

多进程中的 Android Pie (9.0) WebView

如何在 Android 9.0(PIE) 中获取 WIFI SSID?

Android 9 (Pie) - 无法通过 Charles proxy 和 Fiddler 等网络监控工具捕获任何 api (native / web)

下载管理器在 Android Pie 9.0 NetworkSecurityConfig 中不起作用:未指定网络安全配置,使用平台默认值

小花招解决Android 9 Pie 不能反射隐藏API限制