为啥我在升级到 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 文件中,在我的根&lt;widget&gt; 元素中添加属性xmlns:android="http://schemas.android.com/apk/res/android @Der Hochstapler 你能在你的答案中添加 apiagets 评论吗? @MichaelB 每个人都可以编辑答案,欢迎这样做。但是,当然,我会做到的。 @SteevJames 您是否重建了您的 Cordova 项目,以便实际将更改保留到 Android 项目结构中?您是否已验证您的 Android 项目中的 AndroidManifest.xml 已进行更改? 简而言之,我将此行添加到了&lt;application&gt; 下的清单中,它解决了我的问题: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。我指定了域名 example.com 并且它有效。也从这个“developer.android.com/training/articles/security-config”得到帮助 为什么每次运行应用程序时“ 这行得通,但我需要在config.xmledit-config 标签之前添加这一行:&lt;resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" /&gt;。谢谢! @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】:

在开始的 标记中添加以下属性对我有用。在 Android 9 模拟器上简单且实时地重新加载正确。 xmlns: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">

【讨论】:

当我看到这个答案时我没有意识到,但这是除了接受答案中的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>

最重要的一段代码是&lt;base-config cleartextTrafficPermitted="true" /&gt; in &lt;network-security-config&gt; 而不是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 文件的 &lt;edit-config&gt; 标签内添加了 &lt;application android:usesCleartextTraffic="true" /&gt; 标签

<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

在这个文件中,我在&lt;domain-config&gt;标签内添加了2个&lt;domain&gt;标签,根据我的项目要求,主域和子域

<?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.xmlandroid: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 标签中自定义以下几行检查 在 networkSecurityConfigresource-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 解决方案有何不同? 我在单个 标签中添加了“android:usesCleartextTraffic="true" 和“android:networkSecurityConfig="@xml/network_security_config",所以这对我不起作用,当我添加时"android:usesCleartextTraffic="true"" 的新 标签并粘贴在 "android:networkSecurityConfig" 标签之后,然后它对我有用【参考方案17】:

我们正在使用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 命令,必须手动更新。 为什么是 而不是假的?您只想允许您的自定义域并阻止其他域,这就是 domain-config 元素的用途

以上是关于为啥我在升级到 Cordova Android 8 后看到 net::ERR_CLEARTEXT_NOT_PERMITTED 错误?的主要内容,如果未能解决你的问题,请参考以下文章

科尔多瓦升级问题到 3.2

运行子进程cordova 时出错。为啥?

使用 5.1.1 创建 Cordova 项目

有没有人成功地将您的 ionic cordova Hybrid 应用程序从 android 版本 9.x 升级到 android Cordova 版本 10.x

Cordova - 为啥 $http get 请求在 android 设备上失败但在 chrome 上工作

Cordova 不创建 AndroidManifest.xml