Android 8: открытый HTTP-трафик не разрешен



У меня были сообщения от пользователей с Android 8, что мое приложение (которое использует back-end канал) не показывает контент. После расследования я обнаружил следующее исключение, происходящее на 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 в манифесте (и установка его в true не помогает, это значение по умолчанию в любом случае), и я не использую информацию о безопасности сети. Если я вызову NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), он вернется false для Android 8, true для более старой версии, используя тот же файл apk.
Я попытался найти какое-то упоминание об этом в Google info об Android O, но безуспешно.

692   7  

7 ответов:

В соответствии с конфигурацией сетевой безопасности -

Начиная с Android 9.0 (уровень API 28), поддержка открытого текста является по умолчанию отключен.

Также взгляните на - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Вариант 1 -

Создайте файл res / xml / network_security_config.xml -

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

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>

Вариант 2 -

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; Вы можно также установить его на 2. Установка этого атрибута на 2 переключает приложение на другая песочница SELinux. Следующие ограничения применяются к Уровень 2 песочница:

  • значение по умолчанию usesCleartextTraffic в конфигурации сетевой безопасности равно false.
  • совместное использование Uid не допускается.

Итак, Вариант 3 -

Если у вас есть 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>

В 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

Это может быть полезно для кого-то.

Недавно у нас была такая же проблема для Android 9, но нам нужно было только отобразить некоторые URL-адреса в WebView, ничего особенного. Поэтому добавление android:usesCleartextTraffic="true" в манифест сработало, но мы не хотели ставить под угрозу безопасность всего приложения. Поэтому исправление состояло в изменении ссылок с http на https

Ладно, я это понял. Это связано с параметром Манифеста android:targetSandboxVersion="2", который я добавил, Потому что у нас также есть версия Instant App - он должен убедиться, что пользователь не раз обновит приложение Instant до обычного приложения, он не потеряет свои данные при передаче. Однако, как следует из расплывчатого описания:

Задает целевую песочницу, которую должно использовать это приложение. Более высокие версии sanbox будут иметь повышенный уровень безопасности.

Значение этого атрибута по умолчанию равно 1.

Это, очевидно, также добавляет новый уровень политики безопасности, по крайней мере, на Android 8.
<?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>

В предложении, представленном выше, я предоставлял свой URL как http://xyz.abc.com/mno/

Я изменил это на xyz.abc.com затем он начал работать.

Я получил ту же проблему, и я попробовал все вышеперечисленные решения, но ни одно из них не работает.

Для меня я решил это, изменив мой url с HTTP на HTTPS;

Это работает!!!

Только menifest добавить это свойство

  <manifest ...>
  <uses-permission android:name="android.permission.INTERNET" />
  <application
    ...
    android:usesCleartextTraffic="true"
    ...>
    ...
  </application>
  </manifest>

Comments

    Ничего не найдено.