升级到Cordova Android 8后,为什么会看到net :: ERR_CLEARTEXT_NOT_PERMITTED错误?

时间:2019-02-18 17:44:22

标签: android cordova

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

那是为什么,我该如何解决?

19 个答案:

答案 0 :(得分:28)

Cordova Android平台中的默认API级别已升级。在Android 9设备上,明文交流现在为disabled by default

要再次允许纯文本通信,请将android:usesCleartextTraffic标签上的application设置为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。这表示您需要将其添加到同一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">

答案 1 :(得分:7)

我使用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>

感谢所有人。

答案 2 :(得分:6)

我今天自己遇到了这个问题,发现了一个非常漂亮的插件,可以省去尝试为Apache Cordova应用程序手动允许Android 9+中的明文流量的麻烦。只需安装cordova-plugin-cleartext,该插件即可为您处理所有幕后的Android任务。

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

答案 3 :(得分:5)

在开始的标签中添加以下属性对我来说很有效。简单,实时地在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">

答案 4 :(得分:5)

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

  1. config.xml(完整路径:/config.xml)
  2. network_security_config.xml(完整路径:/resources/android/xml/network_security_config.xml)

相应文件中的更改如下:

1。 config.xml

我已在config.xml文件的<application android:usesCleartextTraffic="true" />标签内添加了<edit-config>标签

<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>标签中添加了两个<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>

感谢@Ashutosh提供帮助。

希望有帮助。

答案 5 :(得分:5)

您应该添加

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

答案 6 :(得分:4)

经过几天的努力,这对我有用,我希望这对您也有用。

将此代码添加到代码顶部的 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>

enter image description here

enter image description here

答案 7 :(得分:2)

要解决此问题,还有另一种选择。 在文件资源/android/xml/network_security_config.xml中。插入:

parallel = 5

在我的情况下,我正在使用IP地址,则base-config是必需的,但是如果您有域。只需添加域。

答案 8 :(得分: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,则错误:未绑定前缀。将会出现

答案 9 :(得分:2)

只需将此行添加到platform / android / app / src / main / AndroidManifest.xml文件

<应用程序android:hardwareAccelerated =“ true” android:icon =“ @ mipmap / ic_launcher” android:label =“ @ string / app_name” android:supportsRtl =“ true” android:usesCleartextTraffic =“ true” < / strong >>

答案 10 :(得分:1)

以下解决方案对我有用-

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

答案 11 :(得分:1)

在阅读了整个讨论之后,正在寻找一种授权与所有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>

资源/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" />中的<network-security-config>而不是domain-config

答案 12 :(得分:1)

我正在使用 Vue 和 Capacitor 3 运行 Ionic 5,并且在不支持 https 的网站上使用 InAppBrowser 时出现此错误。对于电容器应用,不使用 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>

答案 13 :(得分:0)

此处的明文表示未加密的信息。从Android 9开始,建议应用程序应调用HTTPS API,以确保有下降的可能。

但是,如果仍然需要调用HTTP API,则可以执行以下操作:

平台:离子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...

现在应该可以工作。

答案 14 :(得分:0)

在我的情况下,旧的离子cli(4.2)引起了问题,更新为5即可解决问题

答案 15 :(得分:0)

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

答案 16 :(得分:0)

@Der Hochstapler感谢您的解决方案。
但是在 IONIC 4 中,项目 config.xml 中的一些自定义对我有用

在Widget标签中添加一行

for (const str of ['A1AAAA', '123', '111', '159', 'A172', 'A1A1A1']) {
  console.log(!/\d{2}/.test(str));
}

在此之后,在android的Platform标记中自定义一些行,请检查以下内容
networkSecurityConfig 资源文件标记

之后添加 usesCleartextTraffic = true
<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">

答案 17 :(得分:0)

在一个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

答案 18 :(得分:0)

如果您的Legacy 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>