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


Answers:


203

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>

如注释中所述,如果您之前未定义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">

36
error: unbound prefix.尝试构建Cordova应用程序时遇到错误()。解决的方法是在我的config.xml文件的根<widget>元素中添加属性xmlns:android="http://schemas.android.com/apk/res/android
apiaget

@Der Hochstapler您可以在答案中添加apiagets注释吗?
迈克尔·B

@MichaelB每个人都可以编辑答案,欢迎这样做。但是,可以,我会做。
德霍赫斯塔普勒

1
@SteevJames是否重建了Cordova项目,以使更改实际上保留在Android项目结构中?您是否已验证对AndroidManifest.xmlAndroid项目中的进行了更改?
Der Hochstapler

这项工作,但就我而言,我必须先删除平台android,然后再工作。
kunal shaktawat

41

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,则错误:未绑定前缀。会出现


35

明文此处表示未加密的信息。从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...

现在应该可以工作了。


谢谢兄弟,它为Ionic 4的我工作。也从此“ developer.android.com/training/articles/security-config
Zaki Mohammed

为什么每次运行应用程序时“ <edit-config ..”都被覆盖?
Jalle

3
这可行,但我需要config.xmledit-config标记之前添加此行<resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />。谢谢!
tyn

@ZakiMohammed请分享您的代码,我也面临同样的问题帮助!
jose

@jose请看看我的回答
Zaki Mohammed

26

为了解决这个问题,还有其他选择。在文件资源/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是必需的,但是如果您有域。只需添加域。


尽管还需要所有公认的解决方案,但此答案是我面临的问题的关键。
彼得·梅德利

为我工作。谢谢
Suhail Mushtaq,

谢谢!我也使用IP代替域名,因此您的答案非常合适!
早期的

22

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

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

对于其他人寻找答案。应用配置修复程序时,我一直受到其他错误的打击,但这立即起作用。感谢Topher
IvanSt '19

为我工作。谢谢!
iwanuschka

没为我工作。
Eskim0

15

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

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

在此处输入图片说明

在此处输入图片说明



1
谢谢您的解决方案,这是唯一为我工作的解决方案。
Lud Osorio

谢谢,这是唯一对我有用的解决方案。
Gerardo SalazarSánchez

这是对我有用的解决方案。具体来说,trust-anchors标签似乎是使所有其他内容正常工作的最终组件。
罗林格

如果您正在使用phonegab构建,则将network_security_config保留在根文件夹上,并以资源文件src =“ network_security_config.xml”的形式提供路径
mujaffars

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

2
当我看到这个答案时,我没有意识到,但这是对已接受答案的代码的补充edit-config(修正了unbound prefix错误)
RishiG

@RishiG现在,这是一个可以解释完全正确答案的答案
zardilior

@zardilior是的,祝贺他在编辑中劫持了答案……大声笑
Mark McCorkle

5

您应该添加

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

为什么这很重要?
Tomas Vancoillie

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

感谢@Ashutosh提供的帮助。

希望能帮助到你。


非常感谢您保存了我的一天。
卡南·穆图库玛(Karnan Muthukumar),

5

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

谢谢大家。


这与现有的离子解决方案有何不同?
Der Hochstapler

情况有所不同。记住人们来自Google搜索。他们在此问题中可能会有不同的情况和设置。就我而言,我的项目运行良好,即使我没有进行任何平台更新或设备更新,它也开始出现此错误。
Rajendra

1
谢谢冠军,这对我有用:)-随着时间的流逝和旧解决方案不再起作用,尤其是在瞬息万变的框架中,确认工作中版本的更新非常好。
格兰特(Grant)

2
谢谢队友,想对我来说这是唯一
可行的

2
谢谢。这解决了我的问题。我尝试了许多其他建议,但是没有用。
MasterJedi

3

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


谢谢。这是我的解决方案。我在App Center上运行了一个单独的构建过程,该过程正在安装ionic来运行ionic cli命令。他们不赞成使用“ ionic”,而推荐使用“ @ ionic / cli”。
MarkHoward02

0

我们正在使用cordova-custom-config插件来管理我们的Android配置。在这种情况下,解决方案是custom-preference向我们添加新的config.xml

    <platform name="android">

        <preference name="orientation" value="portrait" />

        <!-- ... other settings ... -->

        <!-- Allow http connections (by default Android only allows https) -->
        <!-- See: /programming/54752716/ -->
        <custom-preference
            name="android-manifest/application/@android:usesCleartextTraffic"
            value="true" />

    </platform>

有人知道如何仅针对开发版本进行此操作吗?我很乐意发布版本离开此设置false

(我看到了buildType="debug"为此提供的iOS配置,但是我不确定这是否适用于Android配置。)


0

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

这与现有的离子解决方案有何不同?
Der Hochstapler

我在单个<edit-config>标记内添加了“ android:usesCleartextTraffic =” true“和” android:networkSecurityConfig =“ @ xml / network_security_config”,因此对我不起作用,当我为“ android:usesCleartextTraffic =“ true”“并粘贴在” android:networkSecurityConfig“ <edit-config>标记之后,然后它对我有用
yash

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

0

如果您有旧式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>

这与现有的离子解决方案有何不同?
Der Hochstapler

一些旧项目不遵循NPM和Cordova命令,而必须手动更新。
Pradeepta

0

以下解决方案为我工作-

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

0

只需将此行添加到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” >

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.