为什么我在升级到 Cordova Android 8之后看到 net: : ERR _ CLEARTEXT _ NOT _ PERMITTED 错误?

升级到 Cordova Android 8.0后,我看到 net::ERR_CLEARTEXT_NOT_PERMITTED错误时,试图连接到 http://目标。

为什么会这样,我该怎么解决这个问题?

171531 次浏览

Cordova Android 平台中的默认 API 级别已经升级。在 Android 9设备上,明文通信现在是 默认情况下禁用

要再次允许清晰的文本通信,请将 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>

正如注释中指出的那样,如果以前没有定义 android XML 名称空间,那么在生成期间将收到一个 error: unbound prefix。这表明您需要将其添加到相同 config.xml中的 widget标记中,如下所示:

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

在打开的 < widget > 标记中添加以下属性对我来说很有用。在 Android9模拟器上简单而实时地正确重新加载。Android = “ http://schemas.android.com/apk/res/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">

在 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避免了错误: 将出现未绑定前缀

要解决这个问题还有其他选择。 在文件 resources/android/xml/network _ security _ config.xml. insert:

<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 地址然后基础配置是必要的,但如果你有一个域。只要添加域名。

旧离子 Cli (4.2)在我的案例中引起问题,更新为5解决问题

这里的 Cleartext 表示未加密的信息。从 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...

现在应该可以了。

你应该加上

<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>

Resources/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. Xml (Full Path:/config.xml)
  2. 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

在这个文件中,我已经添加了2个 <domain>标签内的 <domain-config>标签,主域和子域根据我的项目要求

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

谢谢@阿舒托什提供的帮助。

希望能有帮助。

经过几天的奋斗,这对我有用,我希望这对你也有用。

把这个加到你的 CONFIG.XML,代码的顶部。

<access origin="*" />
<allow-navigation href="*" />

还有这个,在机器人平台下面。

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

enter image description here

enter image description here

今天我自己也遇到了这个问题,我发现了一个非常好的插件,它可以帮你省去在 Android 9 + 中为 Apache Cordova 应用程序手动允许明文流量的麻烦。只需要安装 cordova-plugin-cleartext,这个插件就可以为你处理所有 Android 的幕后工作。

$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android

我们正在使用 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 配置。)

@ Der Hochstapler 谢谢你的解决方案。
但在 离子4项目 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">

此后,在 Platform 标签中为 android 自定义一些行检查如下
NetworkSecurityConfig资源文件标签之后添加 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 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>

提交工程项目

Resources/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 4电容器项目中,当我打包并部署到 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>

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>

下面的解决方案对我很有效

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

只需将这一行添加到 Platform/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"**>

在阅读了整个讨论之后,寻找一种授权与所有 IP 地址通信的方法,就像我的情况一样,发送请求的 IP 地址是由用户在输入文本中定义的,不能在配置文件中定义。我是这样解决这个问题的

这是配置

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>

最重要的代码是 <network-security-config>中的 <base-config cleartextTrafficPermitted="true" />,而不是 domain-config

我正在运行爱奥尼亚5与 Vue 和电容器3,并得到这个错误使用 在应用程序浏览器中的网站,不支持 https。对于电容器应用程序,不使用 config.xml,而是直接编辑 AndroidManifest.xml

首先,在这里创建 NetworkSecurityConfig 文件 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>