为啥我在升级到 Cordova Android 8 后看到 net::ERR_CLEARTEXT_NOT_PERMITTED 错误?
Posted
技术标签:
【中文标题】为啥我在升级到 Cordova Android 8 后看到 net::ERR_CLEARTEXT_NOT_PERMITTED 错误?【英文标题】:Why am I seeing net::ERR_CLEARTEXT_NOT_PERMITTED errors after upgrading to Cordova Android 8?为什么我在升级到 Cordova Android 8 后看到 net::ERR_CLEARTEXT_NOT_PERMITTED 错误? 【发布时间】:2019-07-12 03:47:39 【问题描述】:升级到Cordova android 8.0 后,我在尝试连接到http://
目标时看到net::ERR_CLEARTEXT_NOT_PERMITTED
错误。
为什么会这样,我该如何解决?
【问题讨论】:
【参考方案1】:已升级 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">
【讨论】:
在尝试构建我的 Cordova 应用程序时遇到错误 (error: unbound prefix.
)。解决方案是在我的config.xml
文件中,在我的根<widget>
元素中添加属性xmlns:android="http://schemas.android.com/apk/res/android
@Der Hochstapler 你能在你的答案中添加 apiagets 评论吗?
@MichaelB 每个人都可以编辑答案,欢迎这样做。但是,当然,我会做到的。
@SteevJames 您是否重建了您的 Cordova 项目,以便实际将更改保留到 Android 项目结构中?您是否已验证您的 Android 项目中的 AndroidManifest.xml
已进行更改?
简而言之,我将此行添加到了<application>
下的清单中,它解决了我的问题:android:usesCleartextTraffic="true"
【参考方案2】:
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 错误:未绑定前缀。会出现
【讨论】:
【参考方案3】:这里的明文表示未加密的信息。从 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...
它现在应该可以工作了。
【讨论】:
谢谢兄弟,它适用于 Ionic 4。我指定了域名config.xml
的edit-config
标签之前添加这一行:<resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
。谢谢!
@ZakiMohammed 请分享您的代码我也面临同样的问题帮助!
@jose 请看我的回答【参考方案4】:
要解决此问题,还有其他选择。 在文件资源/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 是必要的,但如果你有一个域。只需添加域。
【讨论】:
虽然还需要所有公认的解决方案,但这个答案是我面临的问题的关键。 谢谢!我也在使用 IP 而不是域名,您的答案非常适合!【参考方案5】:我今天自己遇到了这个问题,并找到了一个非常棒的插件,它可以让您省去在 Android 9+ 中为您的 Apache Cordova 应用程序手动允许明文流量的麻烦。只需安装 cordova-plugin-cleartext,该插件就会为您处理所有 Android 幕后工作。
$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
【讨论】:
供其他人寻找答案。在应用配置修复程序时,我一直受到其他错误的影响,但这立即奏效了。谢谢托弗 为我工作。谢谢! 对于那些使用 Ionic 的人,不要忘记“ionic cordova prepare”【参考方案6】:经过几天的奋斗,这对我有用,我希望这对你也有用。
将此添加到您的代码顶部的 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>
【讨论】:
你能回答这个吗?***.com/questions/59116787/… 感谢您的解决方案,这是唯一对我有用的解决方案。 谢谢,这是唯一对我有用的解决方案。 这是对我有用的解决方案。具体来说,trust-anchors
标签似乎是让所有其他东西正常工作的最后一个组件。
如果您使用 phonegab 构建,则将 network_security_config 保存在根文件夹中,并将路径作为资源文件 src="network_security_config.xml"【参考方案7】:
在开始的
<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
错误)跨度>
@RishiG 现在这是一个解释完整正确答案的答案
@zardilior 是的,恭喜他在编辑时劫持了答案……哈哈【参考方案8】:
我正在使用 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>
谢谢大家。
【讨论】:
这与现有的 Ionic 解决方案有何不同? 情况不同。记住人们从谷歌搜索来到这里。他们在这个问题上可能有不同的情况和设置。就我而言,我的项目运行良好,即使我没有进行任何平台更新或设备更新,它也刚刚开始出现此错误。 谢谢冠军,这对我有用 :) -- 很高兴确认工作解决方案的版本更新,随着时间的推移,旧的解决方案不再工作,特别是在一个不稳定的不断变化的框架。 谢谢伙计,我想说这对我来说是唯一可行的解决方案 谢谢。这解决了我的问题。我尝试了许多其他建议,但没有奏效。【参考方案9】:在阅读了整个讨论之后,寻找一种授权与所有 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 元素解决了这个问题,非常感谢! ?【参考方案10】:你应该添加
<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>
【讨论】:
为什么这很重要? 哇!完美运行。 . !!!【参考方案11】:以下是对我有用的解决方案。我更新的文件如下:
-
config.xml(完整路径:/config.xml)
network_security_config.xml(完整路径:/resources/android/xml/network_security_config.xml)
对应文件的变化如下:
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 提供帮助。
希望对你有帮助。
【讨论】:
非常感谢您挽救了我的一天。【参考方案12】:只需将此行添加到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"**>
【讨论】:
【参考方案13】:以下解决方案对我有用-
转到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>
【讨论】:
【参考方案14】:在我的情况下,旧的 ionic cli (4.2) 导致问题,更新到 5 解决问题
【讨论】:
谢谢。这就是我的解决方案。我在 App Center 上运行了一个单独的构建过程,它正在安装 ionic 以运行 ionic cli 命令。他们弃用了“ionic”,转而使用“@ionic/cli”。【参考方案15】:我正在运行带有 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>
【讨论】:
【参考方案16】:@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>
【讨论】:
这与现有的 Ionic 解决方案有何不同? 我在单个我们正在使用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://***.com/questions/54752716/ -->
<custom-preference
name="android-manifest/application/@android:usesCleartextTraffic"
value="true" />
</platform>
有人知道如何仅针对开发版本执行此操作吗?我很乐意发布版本保留此设置false
。
(我看到 ios 配置为此提供了 buildType="debug"
,但我不确定这是否适用于 Android 配置。)
【讨论】:
【参考方案18】:在一个 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
【讨论】:
【参考方案19】:如果您的旧版 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>
【讨论】:
这与现有的 Ionic 解决方案有何不同? 一些遗留项目不遵循 NPM 和 Cordova 命令,必须手动更新。 为什么是以上是关于为啥我在升级到 Cordova Android 8 后看到 net::ERR_CLEARTEXT_NOT_PERMITTED 错误?的主要内容,如果未能解决你的问题,请参考以下文章
有没有人成功地将您的 ionic cordova Hybrid 应用程序从 android 版本 9.x 升级到 android Cordova 版本 10.x