Android 8:不允许使用明文HTTP流量


1035

我收到来自使用Android 8的用户的报告,称我的应用程序(使用后端供稿)未显示内容。经过调查,我发现以下异常发生在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和其他可能的标识符)

在Android 7及更低版本上,一切正常,我未android:usesCleartextTraffic在Manifest中进行设置(并且将其设置为true无济于事,无论如何这都是默认值),我也不使用网络安全信息。如果我致电NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(),它将使用相同的apk文件返回旧版本的falseAndroid 8 true。我试图在Google有关Android O的信息中找到对此的提及,但没有成功。


28
检查此CodeLab,但使用cleartextTrafficPermitted="true"
ArtiomLK

5
在我维护的应用程序上会发生这种情况,因为在某些情况下服务器会从HTTPS重定向到HTTP。
Big McLargeHuge

Answers:


2193

根据网络安全配置 -

从Android 9(API级别28)开始,默认情况下禁用明文支持。

还可以看看-https: //koz.io/android-m-and-the-war-on-cleartext-traffic/

Codelabs解释- https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

选项1 -

首先尝试用“ https://”而不是“ http://”打入URL

选项2-

创建文件res / xml / network_security_config.xml-

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</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>

选项3-

android:usesCleartextTraffic Doc

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

正如@ david.s的答案指出的那样,这android:targetSandboxVersion也可能是一个问题-

根据清单文件 -

android:targetSandboxVersion

此应用要使用的目标沙箱。沙盒版本号越高,安全级别越高。默认值为1;默认值为1。您也可以将其设置为2。将此属性设置为2会将应用程序切换到其他SELinux沙箱。以下限制适用于2级沙箱:

  • usesCleartextTraffic网络安全配置中的默认值为false。
  • 不允许共享Uid。

所以选项4-

如果有android:targetSandboxVersion<manifest>则减少到1

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

4
@HrishikeshKadam您的回答受到赞赏,但在最新的P版本中似乎还必须再迈出一步?请参阅我的问题stackoverflow.com/questions/51770323/…–
spartygw

8
ClearText HTTP是否意味着他们只是使用http站点而不是https?
汤姆·哈蒙德

4
对于我来说,将选项1从domain-config更改为base-config可以解决此问题
GregM,

165
如果每个开发人员都要添加,此Android安全功能有android:usesCleartextTraffic="true"什么意义?
水果

69
这甚至没有提到解决此问题的最佳方法:使用HTTPS。此答案中提到的选项只能是不得已的方法。
ChristianBrüggemann19年

131

在AndroidManifest中,我找到了此参数:

android:networkSecurityConfig="@xml/network_security_config"

@@ xml / network_security_config在network_security_config.xml中定义为:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

只是我将cleartextTrafficPermitted更改为true


11
+1如果要在应用程序中使用的所有域中应用它而不是像其他答案建议的那样维护子集,则该功能很有用。
马丁·普赖斯

2
Perfetct。点击此处了解详情:codelabs.developers.google.com/codelabs/...
XXXXXXXXXXXXX

更改后重新安装应用程序
Ssenyonjo

118

我在Android 9中的问题是使用http在域的Webview上导航此答案的解决方案

<application 
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

和:

res / 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>
</network-security-config>

1
只有这个答案对我有用。其他答案对我不起作用。这是最好的答案。
Ahamadullah Saikat

3
完美地工作!非常感谢!
TedVN

1
这个也对我有用,我不知道为什么
新浪Rahimi

我可以以某种方式重写gradle吗?
莫罗佐夫

2
没有一个解决方案对我有用。除了这个.. !! 万分感谢。
Kunal Kakkad

92

您可能只想在调试时允许使用明文,但是保留在生产中拒绝明文的安全性好处。这对我很有用,因为我在不支持https的开发服务器上测试了我的应用程序。以下是在生产环境中强制使用https,但在调试模式下允许使用明文的方法:

在build.gradle中:

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

在AndroidManifest.xml中的application标签中

android:usesCleartextTraffic="${usesCleartextTraffic}"

1
它仅在api 23+上使用。如果您想要一种独立于api的解决方案,那么可以通过以下网址获得认可的解决方案:stackoverflow.com/questions/46302058/…是一个不错的选择……
Rik van Velzen

问题:当应用程序使用可以设计为http或https的Web服务器时,即使http URL需要能够使用Web服务也将使用ClearTextTraffic:“ false”吗?因此,将其设置为true意味着默认情况下https服务不会发送明文吗?
Whyo​​z '19

2
谢啦!它应该是公认的答案。使它正常工作是最安全的事情
dm707 '19

63

将您的网址从更改HTTPHTTPS

可行!!!


97
怎么评价?如果您的服务器网址不是https,则会收到握手异常消息
kkarakk

18
赞成,因为这是正确的做法(在生产环境中)。HTTPS应该是默认值,而不是HTTP。
beetstra

28
@beetsta您假定您完全控制提供内容的内容。因此,这个答案本质上是幼稚的或轻率的。
马丁·普赖斯

10
@beetstra为什么调试时本地计算机上的HTTPS默认设置?这是如此愚蠢,只是谷歌家长式的另一个例子。幸运的是,泰勒的解决方案可以针对调试模式解决此问题。
Bevor

1
@MartinPrice,我同意答案太短,并不适用于所有情况。但是,假设允许HTTP流量是正确的方法,那么大多数其他答案都不是。在所有情况下允许所有主机的明文通信完全忽略了Google首先更改此设置的原因。对于生产环境,HTTPS几乎总是正确的方法。正如我在评论中提到的,在调试环境中允许HTTP当然不是问题。
beetstra

42
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

在以上提供的建议中,我提供的网址为 http://xyz.abc.com/mno/

我将其更改为 xyz.abc.com,然后开始工作。


8
域!= URL。“ http”是协议。该协议绝不是域的一部分。
令人难以置信的

最好的答案。,谢谢您设置“特定于域的配置”比设置“基本配置”更好
trinadh thatakula 19-10-4

这是正确的,那里仅支持FQDN,没有IP地址(上面已修复)。
马丁·泽特勒

不适用于域10.0.2.2。我应该添加端口号吗?
Ssenyonjo

27

好的,这不是⇒ 将它添加到清单中的数千次重复 ,而是基于此的提示,但会给您带来额外的好处(也许还提供一些背景信息)。

Android具有src-Directory的一种覆盖功能。

默认情况下,

/ app / src / main

但是您可以添加其他目录来覆盖您的AndroidManifest.xml。下面是它的工作原理:

  • 创建目录/ app / src / debug
  • 在里面创建AndroidManifest.xml

在此文件的内部,您不必将所有规则都放在其中,而只需将您想从/ app / src / main / AndroidManifest.xml中覆盖的规则放进去

这是一个示例,显示请求的CLEARTEXT-Permission的外观:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yourappname">

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

有了这些知识,您现在可以很容易地将1,2,3作为重载权限的依据,具体取决于您的调试| 主| 释放环境。

这样做的最大好处是……您的生产清单中没有调试资料,并且您可以保持简单易维护的结构


3
这绝对是正确的解决方案。Android之所以添加这些安全设置是有原因的,因此它们应该保留下来。您的解决方案使我们能够在本地不安全环境中进行测试,而正式产品仍将具有建议的安全设置。谢谢!
咕(Coo)

25

对某人可能有用。

我们最近在Android 9上也遇到了同样的问题,但是我们只需要在WebView中显示一些Urls,没有什么特别的。因此,将android:usesCleartextTraffic="true"清单添加到清单中是可行的,但是我们不想为此牺牲整个应用程序的安全性。因此解决方法是将链接从更改httphttps


3
如果我只想显示一些URL,则不需要WebView。我只是使用TextView。;)我想你的意思是显示一些html页面。仅当服务器提供SSL时,您的修复才有效。您不能简单地更改链接。
令人难以置信的

2
当然,这是最好的选择,但出于性能原因或因为资源可能无法在明文HTTP中使用而总是不能总是选择它。
Dakatine

“我们不想破坏整个应用程序的安全性”,它会引起什么安全风险?在我的情况下,没有一个URL,所以我无法在清单中添加它们。
罗伯·威廉姆斯

@RobertWilliams,您好!它只表示清除流量将允许非加密流量。这里是一个博客帖子medium.com/@son.rommer/...
sparkly_frog

同样的问题再次发生。尝试了所有这些解决方案。
Ahamadullah Saikat

22

对于React Native项目

它已在RN 0.59上修复。您可以找到从0.58.6到0.59的升级差异。 您可以在不升级RN版本的情况下应用它,请按照以下步骤操作:

创建文件:

Android设备/应用/ src目录/ 调试 /res/xml/react_native_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设备/应用/ src目录/ 调试 /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>

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


2
我使用react-native 0.59.5,并且我遇到相同的问题,我们必须按照您的建议手动设置AndroidManifest.xml。
克里斯蒂安·莫拉

11

好的,我已经知道了。这是由于添加了Manifest参数android:targetSandboxVersion="2",因为我们还具有Instant App版本-它应确保用户一旦从Instant App升级到常规应用程序,便不会随传输而丢失其数据。但是,模糊的描述表明:

指定此应用要使用的目标沙箱。更高的sanbox版本将具有越来越高的安全级别。

该属性的默认值为1。

显然,它至少在Android 8上也增加了新级别的安全策略。


9

我已经从已经存在的android清单文件中删除了这一行

 android:networkSecurityConfig="@xml/network_security_config" 

并添加

android:usesCleartextTraffic="true"

这到清单中的应用程序标签中

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

然后在Android 9和10中对我来说,此错误的cleartext HTTP流量不允许对overlay.openstreetmap.nl消失了对我来说,我希望这也适用于android 8,如果它得到了帮助,请不要忘记投票谢谢


8

要将这些各种答案应用到Xamarin.Android,您可以使用类和程序集级别的属性,而无需手动编辑AndroidManifest.xml

当然需要Internet许可(duh ..):

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

注意:通常,程序集级属性会添加到您的AssemblyInfo.cs文件中,但会添加到作品下方using和上方的任何文件namespace

然后在Application子类上(如果需要,请创建一个),可以添加NetworkSecurityConfigResources/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

如果您不在doamin上,并且在本地主机地址192.168上,此应用程序将如何工作?该申请不会在Internet上而是在本地网络上运行
rogue39nin

xamrian形式的语法是什么
rogue39nin19年

@ rogue39nin使用我的回答的最后一部分:UsesCleartextTraffic = true
SushiHangover

4

开发应用程序时,我也遇到同样的“不允许明文HTTP通信”错误。我在我的应用程序中使用Retrofit2进行网络调用,并且我有两个项目环境(开发和生产)。我的生产域具有通过HTTPS调用的SSL证书,而开发人员将没有https。配置已添加到构建版本中。但是当我改用dev时,就会触发此问题。因此,我为此添加了以下解决方案。

我在清单中添加了明文流量

 android:usesCleartextTraffic="true"

然后,我在改造配置类OKHttp创建时添加了一个连接规范。

 .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

下面给出了完整的OkHttpClient创建

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();

4

更新2019年12月ionic-4.7.1

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

请在android manifest.xml文件中添加以上内容

离子的先前版本

  1. 确保您config.xml在Ionic Project中具有以下内容:

    <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" />
                <application android:usesCleartextTraffic="true" />
            </edit-config>
  2. 运行ionic Cordova构建android。它在Platforms下创建Android文件夹

  3. 打开Android Studio并打开存在于我们的项目project-platforms-android中的Android文件夹。留下几分钟,以便建立gradle

  4. gradle build完成后,我们得到了一些错误的,包括minSdVersionmanifest.xml。现在,我们要做的只是<uses-sdk android:minSdkVersion="19" />从中删除manifest.xml

    确保从两个位置都将其删除:

    1. 应用→清单→ AndroidManifest.xml
    2. CordovaLib→显示→ AndroidManifest.xml

    现在尝试再次构建gradle,现在可以成功构建

  5. 确保在App→清单→中的Application标签中具有以下内容Androidmanifest.xml

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. 打开network_security_config(应用程序→res→xml→ network_security_config.xml)。

    添加以下代码:

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

xxx.yyyy.com是您的HTTP API的链接。确保在URL之前不包含任何Http。

注意:现在使用Android Studio来构建应用程序(构建-Build Bundle's / APK-Build APK),现在您可以使用该应用程序了,它在Android Pie中可以正常工作。如果您尝试使用ionic Cordova build android来构建应用程序,它将覆盖所有这些设置,因此请确保您使用Android Studio来构建Project。

如果您安装了任何较旧版本的应用程序,请卸载它们并尝试一下,否则将出现一些错误:

未安装应用


离子的?科尔多瓦?因此,这不是正常的Android构建,而是使用前端技术构建本机应用程序的框架
周末

Ionic在android应用中为您提供了webivew实施,而Cordova则帮助您访问了诸如麦克风,相机之类的android本机功能。
Gvs Akhil

3

创建文件-res / xml / network_security.xml

在network_security.xml->

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

打开AndroidManifests.xml:

 android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">

3

出于安全方面的考虑,这样做是可能的,您应该始终尽可能使用HTTPS(HTTP Secure)。
您可以在这里了解更多信息

根据您的情况,有多种解决方案。

如果您尝试与第一方服务进行通信,则IE:您自己的Web服务器

服务器端:您应该向该服务器添加HTTPS支持,并使用HTTPS代替HTTP。这些日子里,你甚至可以做免费使用服务,如LetsEncrypt其他
客户端:如果您使用的是HttpURLConnectionjava.net您可以切换到包HttpsURLConnection中的java.net.ssl包,它有一个类似的,如果不相同的API,因此交换机应该是毫不费力。

如果您使用的是第三方服务,例如Google,Facebook,气象服务等。

如果您正在与之通信的服务支持HTTPS(很可能是这样),则只需将请求URL从更改为http://abc.xyz即可https://abc.xyz

作为最后的选择,如果要与之通信的第三方服务不支持HTTPS或任何其他形式的安全通信,则可以使用此答案,但是再次建议不要这样做,因为它违反了这一非常需要的目的安全功能。


2

就我而言,URL在浏览器中也不起作用。

我通过https://www.google.com/检查

webView.loadUrl("https://www.google.com/")

它为我工作。


myWebView.loadUrl(“ www.site.com”); 也适用于没有SSL作为HTTPS但仅具有HTTP的网站管理员。可能会得到空白页。

如果给定的URL在您的Web浏览器中可用,则可以在您的Webview中使用。否则,您会看到此错误。
Mayuresh Deshmukh,

我知道有时会出现错误,但是大多数时候我都看到空白页,甚至运行。javascript是“ true”,并且我可以正确访问该网站。我不知道为什么会看到空白页,也将zoomable设置为true。


2

对于Xamarin.Android开发人员,请确保HttpClient实现和SSL / TLS设置为Default。

可以在Andorid选项->高级Android选项下找到它。

在此处输入图片说明


2

对我来说,有效的答案是@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"

如果您知道要列入“白名单”的域,则应将接受的答案和上述答案混在一起:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">books.google.com</domain>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>

该代码对我有效,但是我的应用仅需要从books.google.com检索数据。通过这种方式,安全警告消失了。


2
 cleartext support is disabled by default.Android in 9 and above

 Try This one I hope It will work fine

1 Step:->  add inside android build gradle (Module:App)
            useLibrary 'org.apache.http.legacy'

  android {
               compileSdkVersion 28
              useLibrary 'org.apache.http.legacy'

          }

然后2步:->清单添加到清单应用程序标签中

<application
    android:networkSecurityConfig="@xml/network_security_config">//add drawable goto Step 4

   // Step --->3  add to top this line  
     <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />

</application>

//步骤4->>创建Drawable >> 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>
    </network-security-config>

是否可以在aosp中更改此设置?
阴影

@Shadow是的,您可以更改它。
Ashif

我可以知道在哪里可以更改它?
影子

@Shadow <base-config cleartextTrafficPermitted =“ true”> <trust-anchors> <证书src =“ system” /> </ trust-anchors> </ base-config> <domain-config cleartextTrafficPermitted =“ true”> <domain includeSubdomains =“ true”> www.yourwebsidedomain.com </ domain> </ domain-config>
Ashif

没有!!同样,您在应用程序方面说。我问如何更改framework / <>文件夹类?
阴影

1

升级到React Native 0.58.5或更高版本。他们includeSubdomain在RN 0.58.5中的配置文件中。

变更日志

在Rn 0.58.5中,他们已经声明network_security_config了其服务器域。网络安全配置允许应用允许来自特定域的明文流量。因此,无需android:usesCleartextTraffic="true"在清单文件的application标签中进行声明,就可以付出更多的精力。升级RN版本后,它将自动解决。


1

更改API版本9.0后,将错误消息明文HTTP流量禁止发送到YOUR-API.DOMAIN.COM(targetSdkVersion =“ 28”)。在xamarin,xamarin.android和android studio中。

解决xamarin,xamarin.android和android studio中此错误的两个步骤。

步骤1:创建文件resources / xml / network_security_config.xml

在network_security_config.xml中

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">mobapi.3detrack.in</domain>
  </domain-config>
</network-security-config>

步骤2:更新AndroidManifest.xml-

在应用程序标签上添加android:networkSecurityConfig =“ @ xml / network_security_config”。例如:

<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">


1

如果您使用的是ionic并在本机http插件期间出现此错误,则需要完成以下修复程序-

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

那对我有用!


1

在清单文件中添加... android:usesCleartextTraffic =“ true” ...可能会解决此问题,但对数据完整性构成威胁。

出于安全原因,我在清单文件中使用了清单占位符android:usesCleartextTraffic(例如,在接受的答案的选项3中,即@ Hrishikesh Kadam的响应),仅允许在调试环境中使用明文。

在我的build.gradle(:app)文件中,我添加了一个清单占位符,如下所示:

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

注意上面这一行的占位符名称cleartextTrafficPermitted

            manifestPlaceholders.cleartextTrafficPermitted ="true"

然后在我的Android清单中,我使用了相同的占位符...

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

这样,仅在调试环境下才允许明文通信。


0

明文是任何未加密或打算加密的传输或存储的信息。

当应用使用明文网络流量(例如HTTP(非https))与服务器进行通信时,可能会增加黑客入侵和篡改内容的风险。第三方可以注入未经授​​权的数据或泄露有关用户的信息。这就是为什么鼓励开发人员仅保护流量(例如HTTPS)的原因。 是解决此问题的实现方式和参考。



0

我将Cordova 8与cordova-plugin-whitelist 1.3.4结合使用,并且它默认配置我的应用程序无法访问互联网,我只在manifest.xml-> android:usesCleartextTraffic =“ true”中添加一个参数

mainfest的路径在Cordova 8中已更改:platform / android / app / src / main / AndroidManifest.xml。

 <?xml version='1.0' encoding='utf-8'?>
    <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
        <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
        <application 
android:hardwareAccelerated="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:usesCleartextTraffic="true">
            <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
                <intent-filter android:label="@string/launcher_name">
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    </manifest>

这是一个真正的愚蠢,因为很明显您的应用程序需要访问互联网...。


0

最简单的解决方案[Xamarin形式]

对于Android

  1. 转到Android Project,然后单击Properties

在此处输入图片说明

  1. 打开AssemblyInfo.cs并粘贴以下代码:

    [assembly: Application(UsesCleartextTraffic =true)]

在此处输入图片说明

对于iOS

用途NSAppTransportSecurity

在此处输入图片说明

您必须将NSAllowsArbitraryLoads密钥设置为文件中的字典YES下。NSAppTransportSecurityinfo.plist

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Plist配置

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.