【发布时间】:2019-07-12 03:47:39
【问题描述】:
升级到Cordova Android 8.0 后,我在尝试连接到http:// 目标时看到net::ERR_CLEARTEXT_NOT_PERMITTED 错误。
为什么会这样,我该如何解决?
【问题讨论】:
升级到Cordova Android 8.0 后,我在尝试连接到http:// 目标时看到net::ERR_CLEARTEXT_NOT_PERMITTED 错误。
为什么会这样,我该如何解决?
【问题讨论】:
已升级 Cordova Android 平台中的默认 API 级别。在 Android 9 设备上,明文通信现在是 disabled by default。
要再次允许明文通信,请将application 标签上的android:usesCleartextTraffic 设置为true:
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
如 cmets 中所述,如果您之前未定义 android XML 命名空间,您将在构建期间收到 error: unbound prefix。这表示您需要将其添加到您的widget 标记中的同一个config.xml 中,如下所示:
<widget id="you-app-id" version="1.2.3"
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cdv="http://cordova.apache.org/ns/1.0">
【讨论】:
error: unbound prefix.)。解决方案是在我的config.xml 文件中,在我的根<widget> 元素中添加属性xmlns:android="http://schemas.android.com/apk/res/android
AndroidManifest.xml 已进行更改?
<application> 下的清单中,它解决了我的问题:android:usesCleartextTraffic="true"
config.xml 中有两点需要更正 所以正确的答案应该是添加 xmls:android:
<widget id="com.my.awesomeapp" version="1.0.0"
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cdv="http://cordova.apache.org/ns/1.0">
加上编辑配置以允许:
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
如果避免步骤 1 错误:未绑定前缀。会出现
【讨论】:
这里的明文表示未加密的信息。从 Android 9 开始,建议应用调用 HTTPS API 以确保没有前夕掉落。
但是,如果我们仍然需要调用 HTTP API,我们可以这样做:
平台:Ionic 4
在project-root/resources/android/xml下创建一个名为:network_security_config.xml的文件
添加以下行:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain>ip-or-domain-name</domain>
</domain-config>
</network-security-config>
现在在 project-root/config.xml 中,更新以下行:
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
<application android:usesCleartextTraffic="true" />
<application android:networkSecurityConfig="@xml/network_security_config" />
</edit-config>
... other statements...
它现在应该可以工作了。
【讨论】:
config.xml 的edit-config 标签之前添加这一行:<resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />。谢谢!
要解决此问题,还有其他选择。 在文件资源/android/xml/network_security_config.xml 中。插入:
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<domain-config cleartextTrafficPermitted="true">
<domain>localhost</domain>
<domain includeSubdomains="true">192.168.7.213:8733</domain>
</domain-config>
</network-security-config>
在我的情况下,我使用的是 IP 地址,那么 base-config 是必要的,但如果你有一个域。只需添加域。
【讨论】:
我今天自己遇到了这个问题,并找到了一个非常棒的插件,它可以让您省去在 Android 9+ 中为您的 Apache Cordova 应用程序手动允许明文流量的麻烦。只需安装 cordova-plugin-cleartext,该插件就会为您处理所有 Android 幕后工作。
$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
【讨论】:
经过几天的奋斗,这对我有用,我希望这对你也有用。
将此添加到您的代码顶部的 CONFIG.XML。
<access origin="*" />
<allow-navigation href="*" />
还有这个,在android平台下。
<edit-config file="app/src/main/AndroidManifest.xml"
mode="merge" target="/manifest/application"
xmlns:android="http://schemas.android.com/apk/res/android">
<application android:usesCleartextTraffic="true" />
<application android:networkSecurityConfig="@xml/network_security_config" />
</edit-config>
<resource-file src="resources/android/xml/network_security_config.xml"
target="app/src/main/res/xml/network_security_config.xml" />
将以下代码添加到此文件“resources/android/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">localhost</domain>
<domain includeSubdomains="true">YOUR DOMAIN HERE/IP</domain>
</domain-config>
</network-security-config>
【讨论】:
trust-anchors 标签似乎是让所有其他东西正常工作的最后一个组件。
在开始的
<widget id="com.my.awesomeapp" version="1.0.0"
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cdv="http://cordova.apache.org/ns/1.0">
【讨论】:
edit-config 代码(修复了unbound prefix 错误)跨度>
我正在使用 IONIC 5.4.13、cordova 9.0.0 (cordova-lib@9.0.1)
我可能会重复信息,但对我来说,添加一些插件后问题开始出现(尚不确定)。 我尝试了所有上述组合,但没有任何效果。 添加后才开始工作:
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
在项目中归档
资源/android/xml/network_security_config.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">localhost</domain>
<domain includeSubdomains="true">10.1.25.10</domain>
</domain-config>
</network-security-config>
谢谢大家。
【讨论】:
在阅读了整个讨论之后,寻找一种授权与所有 IP 地址通信的方法,因为在我的情况下,将发送请求的 IP 地址由用户在输入文本中定义,无法在配置中定义文件。这是我解决问题的方法
这里是配置
config.xml
<platform name="android">
...
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
<application android:networkSecurityConfig="@xml/network_security_config" />
</edit-config>
<resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
...
</platform>
resources/android/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
最重要的一段代码是<base-config cleartextTrafficPermitted="true" /> in <network-security-config> 而不是domain-config
【讨论】:
你应该添加
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
到
资源/android/xml/network_security_config.xml
喜欢这个
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">localhost</domain>
</domain-config> </network-security-config>
【讨论】:
以下是对我有用的解决方案。我更新的文件如下:
对应文件的变化如下:
1. config.xml
我在 config.xml 文件的 <edit-config> 标签内添加了 <application android:usesCleartextTraffic="true" /> 标签
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
<application android:usesCleartextTraffic="true" />
<application android:networkSecurityConfig="@xml/network_security_config" />
</edit-config>
...
<platform name="android">
2。 network_security_config.xml
在这个文件中,我在<domain-config>标签内添加了2个<domain>标签,根据我的项目要求,主域和子域
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">mywebsite.in</domain>
<domain includeSubdomains="true">api.mywebsite.in</domain>
</domain-config>
</network-security-config>
感谢@Ashutosh 提供帮助。
希望对你有帮助。
【讨论】:
只需将此行添加到platforms/android/app/src/main/AndroidManifest.xml 文件中
<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" **android:usesCleartextTraffic="true"**>
【讨论】:
以下解决方案对我有用-
转到resources/android/xml/network_security_config.xml
改成-
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">localhost</domain>
<domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
</domain-config>
</network-security-config>
【讨论】:
在我的情况下,旧的 ionic cli (4.2) 导致问题,更新到 5 解决问题
【讨论】:
我正在运行带有 Vue 和 Capacitor 3 的 Ionic 5,并且在不支持 https 的网站上使用 InAppBrowser 时遇到此错误。对于 Capacitor 应用,config.xml 未使用,AndroidManifest.xml 直接编辑。
首先,在这里创建网络安全配置文件YOUR_IONIC_APP_ROOT\android\app\main\res\xml\network_security_config.xml。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain>www.example.com</domain>
</domain-config>
</network-security-config>
然后编辑YOUR_IONIC_APP_ROOT\android\app\main\AndroidManifest.xml 将android:networkSecurityConfig="@xml/network_security_config" 添加到application。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.ionic.starter">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- ... -->
</application>
<!-- ... -->
</manifest>
【讨论】:
@Der Hochstapler 感谢您的解决方案。
但在 IONIC 4 项目中的一些自定义 config.xml 对我有用
在 Widget 标签中添加一行
<widget id="com.my.awesomeapp" version="1.0.0"
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cdv="http://cordova.apache.org/ns/1.0">
在此之后,在 android 的 Platform 标签中自定义以下几行检查
在 networkSecurityConfig 和 resource-file 标记之后添加 usesCleartextTraffic=true
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
<application android:networkSecurityConfig="@xml/network_security_config" />
</edit-config>
<resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
<edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
【讨论】:
我们正在使用cordova-custom-config 插件来管理我们的 Android 配置。在这种情况下,解决方案是在我们的config.xml 中添加一个新的custom-preference:
<platform name="android">
<preference name="orientation" value="portrait" />
<!-- ... other settings ... -->
<!-- Allow http connections (by default Android only allows https) -->
<!-- See: https://stackoverflow.com/questions/54752716/ -->
<custom-preference
name="android-manifest/application/@android:usesCleartextTraffic"
value="true" />
</platform>
有人知道如何仅针对开发版本执行此操作吗?我很乐意发布版本保留此设置false。
(我看到 iOS 配置为此提供了 buildType="debug",但我不确定这是否适用于 Android 配置。)
【讨论】:
在一个 Ionic 4 电容器项目中,当我打包并部署到 Android 手机进行测试时,我得到了这个错误。通过重新安装电容和更新android平台解决。
npm run build --prod --release
npx cap copy
npm install --save @capacitor/core @capacitor/cli
npx cap init
npx cap update android
npx cap open android
【讨论】:
如果您的旧版 Cordova 框架存在 NPM 和 Cordova 命令问题。我会建议以下选项。
创建文件 android/res/xml/network_security_config.xml -
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
【讨论】: