升级到Cordova Android 8.0后,尝试连接到net::ERR_CLEARTEXT_NOT_PERMITTED
目标时看到http://
错误。
那是为什么,我该如何解决?
答案 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)
在开始的
<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文件的<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>
答案 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 和资源文件标记
<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>