我收到android8用户的报告说,我的应用程序(使用后端feed)没有显示内容。经过调查,我发现android 8出现了以下异常:
08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
(我已经删除了包名、url和其他可能的标识符)
在android7和更低版本上,一切正常,我不设置 android:usesCleartextTraffic
在manifest中(并将其设置为 true
没有帮助,这是默认值),我也不使用网络安全信息。如果我打电话 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
,它返回 false
对于android 8, true
对于旧版本,使用相同的apk文件。我试着在google上找到一些关于androido的信息,但是没有成功。
18条答案
按热度按时间1dkrff031#
正在添加。。。android:usescleartexttraffic=“真的”。。。你的清单文件可能会出现修复问题,但它打开了对数据完整性的威胁。
出于安全原因,我将清单占位符用于android:usescleartexttraffic inside 清单文件(如接受答案的选项3,即@hrishikesh kadam的响应)只允许在调试环境中使用明文。
在build.gradle(:app)文件中,我添加了一个清单占位符,如下所示:
注意上面这一行的占位符名cleartexttrafficallowed
然后在我的android清单中,我使用了相同的占位符。。。
androidmanifest.xml-
这样,只有在调试环境下才允许明文通信。
wvt8vs2t2#
简单易行的解决方案
对于android
转到
Android Project
,然后单击Properties
,打开
AssemblyInfo.cs
把这个代码贴在那里:[assembly: Application(UsesCleartextTraffic =true)]
对于ios
使用
NSAppTransportSecurity
:你必须设置
NSAllowsArbitraryLoads
关键YES
低于NSAppTransportSecurity
你的字典info.plist
文件。gwo2fgha3#
在上面提供的建议中,我提供了我的url作为http://xyz..com/mno/
我把它改成xyz..com然后它就开始工作了。
xfb7svmp4#
更新日期:2019年12月-4.7.1
请在android manifest.xml文件中添加以上内容
以前版本的爱奥尼亚
确保你的电脑里有以下内容
config.xml
在爱奥尼亚项目中:运行ionic cordova build android。它在平台下创建android文件夹
打开androidstudio,打开android项目平台中的android文件夹。让它静置几分钟,这样它就能形成梯度
之后
gradle build
完成后,我们得到一些错误,包括minSdVersion
在manifest.xml
. 现在我们要做的就是移除<uses-sdk android:minSdkVersion="19" />
从manifest.xml
.确保将其从两个位置移除:
应用程序→ 舱单→
AndroidManifest.xml
.科多瓦利布→ 舱单→
AndroidManifest.xml
.现在再次尝试构建gradle,现在它成功构建了
确保应用程序中的应用程序标签中有以下内容→ 显示→
Androidmanifest.xml
:打开
network_security_config
(应用→ 对象→ xml格式→network_security_config.xml
).添加以下代码:
在这里
.yyyy.com
是http api的链接。确保在url之前不包含任何http。注意:现在使用androidstudio(build--build bundle's/apk--build apk)构建应用程序,现在您可以使用该应用程序,它在android pie中运行良好。如果你试着用爱奥尼亚cordova构建android来构建应用程序,它会覆盖所有这些设置,所以确保你使用android studio来构建项目。
如果您安装了任何旧版本的应用程序,请卸载它们并进行尝试,否则您将留下一些错误:
应用程序未安装
jdgnovmf5#
创建文件-res/xml/network\u security.xml
在network\u security.xml中->
打开androidmanifests.xml:
7ajki6be6#
我已经从已经存在的android清单文件中删除了这一行
并补充道
此应用程序标记位于清单中
然后这个错误明文http流量覆盖。openstreetmap.nl不允许的是我在android 9和10。我希望这将适用于android 8也如果它是帮助你不要忘记投票谢谢
j91ykkif7#
您可能只希望在调试时允许明文,但保留在生产中拒绝明文的安全好处。这对我很有用,因为我在不支持https的开发服务器上测试我的应用程序。以下是如何在生产中强制使用https,但允许在调试模式下使用明文:
内部版本.gradle:
在androidmanifest.xml中的应用程序标记中
yx2lnoni8#
在androidmanifest中,我找到了以下参数:
@xml/network\u security\u config在network\u security\u config.xml中定义为:
只是我把cleartexttrafficallowed改成了true
carvr3hs9#
根据网络安全配置-
从android9(api级别28)开始,默认情况下禁用cleartext支持。
也看看-https://koz.io/android-m-and-the-war-on-cleartext-traffic/
代码实验室解释-https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html
方案1-
首先尝试用“https://”而不是“http://”点击url
方案2-
创建文件res/xml/network\u security\u config.xml-
androidmanifest.xml-
方案3-
android:usescleartexttraffic doc
androidmanifest.xml-
正如@david.s的回答所指出的
android:targetSandboxVersion
也可能是个问题-根据舱单文件-
android:targetSandboxVersion
此应用程序要使用的目标沙盒。沙盒版本号越高,安全级别就越高。其默认值为1;也可以将其设置为2。将此属性设置为2会将应用程序切换到不同的selinux沙盒。以下限制适用于级别2沙盒:的默认值
usesCleartextTraffic
在网络安全配置中为false。不允许uid共享。
所以选择4-
如果你有
android:targetSandboxVersion
在<manifest>
然后把它减少到1
androidmanifest.xml-g6baxovj10#
好的,就是这样⇒⇒ 不是⇐⇐ 成千上万次的重复会将其添加到您的清单中,但是一个基于此的提示会给您带来额外的好处(也许还有一些背景信息)。
android有一种覆盖src目录的功能。
默认情况下,您有
/应用程序/src/main
但是您可以添加其他目录来覆盖androidmanifest.xml。其工作原理如下:
创建目录/app/src/debug
在内部创建androidmanifest.xml
在这个文件中,您不必把所有规则都放在里面,只需要从/app/src/main/androidmanifest.xml中覆盖那些规则
下面是请求的明文权限的外观示例:
有了这些知识,您现在可以轻松地根据调试主发布环境重载权限。
最大的好处是。。。您的产品清单中没有调试内容,并且您保持了一个直接且易于维护的结构
nbysray511#
它可能对某人有用。
我们最近在android9上也遇到了同样的问题,但是我们只需要在webview中显示一些url,没有什么特别的。所以添加
android:usesCleartextTraffic="true"
清单的工作,但我们不想损害整个应用程序的安全性。所以解决方法是从http
至https
5hcedyr012#
在开发应用程序时,我也遇到了同样的“不允许明文http通信”错误。我在我的应用程序中使用Reformat2进行网络调用,我有两个项目环境(开发和生产)。我的生产域有带有https调用的ssl证书,而dev没有https。在构建风格中添加了配置。但当我换成dev时,这个问题就会触发。所以我添加了下面的解决方案。
我在清单中添加了明文通信
然后我在改造配置类okhttp creation time中添加了一个连接规范。
下面给出了完整的okhttpclient创建
oxosxuxt13#
好吧,我已经弄明白了。这是由于manifest参数
android:targetSandboxVersion="2"
,我补充说,因为我们也有即时应用程序版本-它应该确保比一旦用户从即时应用程序升级到常规应用程序,他不会失去他的数据传输。然而,正如模糊的描述所暗示的:指定此应用程序要使用的目标沙盒。更高的sanbox版本将具有更高的安全级别。
此属性的默认值为1。
显然,它还增加了新的安全策略级别,至少在android8上是这样。
aij0ehis14#
更改您的url
HTTP
至HTTPS
;成功了!!!
6tdlim6h15#
我在android9中遇到的问题是使用http在域上的webview上导航,这个答案给出了解决方案
以及:
res/xml/network\u security\u config.xml文件