【问题标题】: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 错误。

为什么会这样,我该如何解决?

【问题讨论】:

    标签: android cordova


    【解决方案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>
      

      【讨论】:

      • 感谢您的解决方案,这是唯一对我有用的解决方案。
      • 谢谢,这是唯一对我有用的解决方案。
      • 这是对我有用的解决方案。具体来说,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】:

      以下是对我有用的解决方案。我更新的文件如下:

      1. config.xml(完整路径:/config.xml)
      2. 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://stackoverflow.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 元素的用途
                猜你喜欢
                • 1970-01-01
                • 2020-10-07
                • 1970-01-01
                • 2013-09-03
                • 1970-01-01
                • 1970-01-01
                • 2011-06-22
                • 1970-01-01
                • 2016-06-22
                相关资源
                最近更新 更多