android 8:不允许明文http通信

wztqucjr  于 2021-06-29  发布在  Java
关注(0)|答案(18)|浏览(504)

我收到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的信息,但是没有成功。

siv3szwd

siv3szwd16#

对于本地项目
它已经固定在rn 0.59上。您可以在从0.58.6升级到0.59的diff中找到,您可以在不升级rn版本的情况下应用它,只需执行以下步骤:
创建文件:
android/app/src/debug/res/xml/react\u native\u config.xml-

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

android/app/src/debug/androidmanifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

  <application tools:targetApi="28"
      tools:ignore="GoogleAppIndexingWarning" 
      android:networkSecurityConfig="@xml/react_native_config" />
</manifest>

检查已接受的答案以了解根本原因。

7gyucuyw

7gyucuyw17#

将这些不同的答案应用于 Xamarin.Android ,您可以使用类和程序集级属性,而不是手动编辑 AndroidManifest.xml 当然需要互联网许可(duh…):

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]

注意:通常程序集级属性会添加到 AssemblyInfo.cs 文件,但任何文件,在 using 在上面 namespace 作品。
然后在应用程序子类(如果需要,创建一个)上,可以添加 NetworkSecurityConfig 引用 Resources/xml/ZZZZ.xml 文件:


# if DEBUG

[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]

# else

[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]

# endif

public class App : Application
{
    public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
    public App() { }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}

在中创建文件 Resources/xml 文件夹(创建 xml 文件夹(如果需要)。
例子 xml/network_security_config 文件,根据需要调整(参见其他答案)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
          <domain includeSubdomains="true">www.example.com</domain>
          <domain includeSubdomains="true">notsecure.com</domain>
          <domain includeSubdomains="false">xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>

您也可以使用 UsesCleartextTraffic 上的参数 ApplicationAttribute :


# if DEBUG

[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]

# else

[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]

# endif
0x6upsns

0x6upsns18#

而对我来说,有效的答案是@pablocegarra:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

您可能会收到有关 cleartextTrafficPermitted="true" 如果你知道要访问的域

相关问题