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

Der*_*ler 77 android cordova

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

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

Der*_*ler 137

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

要再次允许明文交流,请将标签android:usesCleartextTraffic上的设置applicationtrue

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>
Run Code Online (Sandbox Code Playgroud)

如注释中所述,如果您之前未定义androidXML名称空间,则将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">
Run Code Online (Sandbox Code Playgroud)

  • 尝试构建Cordova应用程序时遇到错误(“错误:未绑定前缀”。)。解决方案是在我的config.xml文件中的根&lt;widget&gt;元素中添加属性xmlns:android =“ http:// schemas.android.com / apk / res / android` (28认同)
  • 简而言之,我将此行添加到“&lt;application&gt;”下的清单中,它解决了我的问题:“android:usesCleartextTraffic="true"” (2认同)

top*_*sen 29

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

$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
Run Code Online (Sandbox Code Playgroud)


zar*_*ior 28

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">
Run Code Online (Sandbox Code Playgroud)

加上编辑配置以允许:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>
Run Code Online (Sandbox Code Playgroud)

如果避免了步骤1,则错误:未绑定前缀。会出现


Sus*_*hil 18

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

将此添加到您的CONFIG.XML,代码的顶部。

<access origin="*" />
<allow-navigation href="*" />
Run Code Online (Sandbox Code Playgroud)

而这个,在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" />
Run Code Online (Sandbox Code Playgroud)

将以下代码添加到此文件"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>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在此处输入图片说明


Ash*_*osh 16

明文此处表示未加密的信息。从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>
Run Code Online (Sandbox Code Playgroud)

现在在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...
Run Code Online (Sandbox Code Playgroud)

现在应该可以工作了。

  • 这可行,但我需要在“edit-config”标记之前的“config.xml”中添加这一行:“&lt;resource-file src =”resources/android/xml/network_security_config。 xml" target="app/src/main/res/xml/network_security_config.xml" /&gt;```。谢谢! (5认同)

小智 13

为了解决这个问题,还有其他选择。在文件资源/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>
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*kle 12

在开头的<widget>标记内添加以下属性对我来说很有效。简单,实时地在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">
Run Code Online (Sandbox Code Playgroud)

  • 当我看到这个答案时我没有意识到,但这是_除了_接受的答案中的`edit-config`代码(修复了`unbound prefix`错误) (2认同)

小智 10

我使用 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>
Run Code Online (Sandbox Code Playgroud)

在项目中归档

资源/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>
Run Code Online (Sandbox Code Playgroud)

谢谢大家。

  • 谢谢伙计,想说对我来说这是唯一可行的解​​决方案 (2认同)
  • 谢谢。这解决了我的问题。我尝试了许多其他建议,但没有奏效。 (2认同)

Zak*_*med 6

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

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

对应文件的变化如下:

1.配置文件

我在 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">
Run Code Online (Sandbox Code Playgroud)

2.network_security_config.xml

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

<?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>
Run Code Online (Sandbox Code Playgroud)

感谢@Ashutosh 提供帮助。

希望能帮助到你。


mus*_*med 5

您应该添加

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>
Run Code Online (Sandbox Code Playgroud)

资源/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>
Run Code Online (Sandbox Code Playgroud)


Man*_*wis 5

只需将此行添加到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"**>
Run Code Online (Sandbox Code Playgroud)


sto*_*odi 5

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

这是配置

配置文件

<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>
Run Code Online (Sandbox Code Playgroud)

资源/android/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
Run Code Online (Sandbox Code Playgroud)

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