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, но безуспешно.
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>, то уменьшите его до1AndroidManifest.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 до обычного приложения, он не потеряет свои данные при передаче. Однако, как следует из расплывчатого описания:Это, очевидно, также добавляет новый уровень политики безопасности, по крайней мере, на Android 8.Задает целевую песочницу, которую должно использовать это приложение. Более высокие версии sanbox будут иметь повышенный уровень безопасности.
Значение этого атрибута по умолчанию равно 1.
<?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