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】:完全有效的解决方案适用于面临此问题的 Android
或 React-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>
【讨论】:
哇,感谢它在我的应用程序中运行良好,在它显示 i/o 故障问题现在解决之前 如果您收到tools:ignore
错误,请确保在您的application
中添加xmlns:tools="http://schemas.android.com/tools"
。像这样<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
添加到位于<project>/android/app/src/debug/res/xml
的react_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 中不起作用:未指定网络安全配置,使用平台默认值