Пользователи 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
не помогает, это значение по умолчанию в любом случае), также я не использую Network Security Information. Если я вызываю NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
, он возвращает false
для Android 8, true
для более старой версии, используя тот же apk-файл.
Я пытался найти упоминание об этом в информации Google об Android O, но безуспешно.
Согласно Конфигурация сетевой безопасности -
Начиная с Android 9 (уровень 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">domain.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>
Вариант 2 -
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' answer, android:targetSandboxVersion
тоже может быть проблемой.
Согласно Manifest Docs -
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 заключалась в навигации по веб-просмотру по доменам с http Решение от этот ответ
<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>
Возможно, вы захотите разрешить cleartext только во время отладки, но сохраняете преимущества безопасности, связанные с отказом от cleartext в производстве. Это полезно для меня, потому что я тестирую свое приложение на сервере разработки, который не поддерживает https. Вот как обеспечить соблюдение https в производстве, но разрешить cleartext в режиме отладки:
В build.gradle:
// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]
// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]
В теге приложения в AndroidManifest.xml
android:usesCleartextTraffic="${usesCleartextTraffic}"
Измените ваш URL с HTTP
на HTTPS
;
Это работает!!!
<?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 , затем он начал работать.
Это может быть полезно для кого-то.
Недавно у нас был такой же выпуск для Android 9, но нам нужно было только отобразить некоторые URL в WebView, ничего особенного. Таким образом, добавление android: usesCleartextTraffic = "true"
к Манифесту сработало, но мы не хотели ставить под угрозу безопасность всего приложения для этого.
Таким образом, исправление заключалось в изменении ссылок с http
на https
Хорошо, это ⇒ НЕ тысячи повторений добавьте его в свой Манифест , но подсказка, которая основывается на этом, но дает вам дополнительное преимущество ** (и, возможно, некоторую справочную информацию).
Android имеет своего рода функцию перезаписи для src-Directory.
По умолчанию у вас есть
- / app / src / ** main ***
Но вы можете добавить дополнительные каталоги для перезаписи вашего 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>
Обладая этими знаниями, теперь вам легко перегрузить свои разрешения в зависимости от вашего отладки | main | release Enviroment.
Большая выгода от этого... у вас нет отладки в вашем производстве-Manifest, и вы сохраняете прямую и простую конструкцию
Для React Native проектов
Это было уже исправлено на RN 0.59. Вы можете найти на [upgrade diff от 0,58,6 до 0,59][1] Вы можете применить его без обновления RN versionust, выполнив следующие действия:
Создать файлы:
android / app / src / debug / 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 / 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>
Проверьте принятый ответ, чтобы узнать причину.
[1]: https://github.com/react-native-community/rn-diff-purge/compare/version/0.58.6...version / 0.59.0 # diff-ce925d749acbf5fb99afc2d465a0f352R7
Хорошо, я разобрался с этим. Это связано с параметром манифеста android:targetSandboxVersion="2"
, который я добавил, потому что у нас также есть версия Instant App - он должен гарантировать, что, когда пользователь перейдет с Instant App на обычное приложение, он не потеряет свои данные при переносе. Однако, как следует из расплывчатого описания:
Указывает целевую песочницу, которую хочет использовать это приложение. Более высокие версии песочницы будут иметь более высокий уровень безопасности.
По умолчанию значение этого атрибута равно 1.
Очевидно, что он также добавляет новый уровень политики безопасности, по крайней мере на Android 8.
Чтобы применить эти различные ответы к Xamarin.Android
, вы можете использовать атрибуты класса и уровня сборки против. вручную редактируя AndroidManifest.xml
Разрешение на интернет, конечно, необходимо (дух..):
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
Примечание. Обычно атрибуты уровня сборки добавляются в файл AssemblyInfo.cs
, но любой файл под using
и над namespace
работает.
Затем в подклассе приложения (при необходимости создайте его) вы можете добавить NetworkSecurityConfig
со ссылкой на файл Resources / xml / ZZZ.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
У меня также есть та же ошибка «Cleartext HTTP трафик не разрешен» при разработке моего Приложения. Я использую Retrofit2 для сетевых вызовов в моем приложении, и у меня есть две среды проекта (dev & production). Мой производственный домен имеет SSL-сертификат с вызовами HTTPS, и у dev не будет https. Конфигурация добавляется в сборке ароматов. Но когда я перейду на dev, эта проблема сработает. Поэтому я добавил ниже решение для этого.
Я добавил трафик cleartext в манифесте
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();
В моем случае этот URL также не работает в браузере.
Я проверяю с https://www.google.com/
webView.loadUrl("https://www.google.com/")
И это сработало для меня.
Просто добавьте android: usesCleartextTraffic = "true" внутри < application > в файле AndroidManifest.xml
добавление этого параметра в заголовок решило мою проблему в apiSauce React Native
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json"
Для разработчиков Xamarin.Android убедитесь, что для реализации HttpClient и SSL / TLS установлено значение по умолчанию.
Его можно найти в разделе «Параметры андорида» - > Расширенные параметры Android.
Обновите до React Native 0.58.5 или выше версии.
Они имеют includeSubdomain
в своих файлах конфигурации в RN 0.58.5.
В Rn 0.58.5 они объявили network_security_config
своим доменом сервера. Конфигурация сетевой безопасности позволяет приложению разрешать трафик cleartext из определенного домена. Поэтому нет необходимости прилагать дополнительные усилия, объявляя android: usesCleartextTraffic = "true"
в теге приложения вашего файла манифеста. Он будет решен автоматически после обновления версии RN.
После изменения версии API 9.0 получение ошибки Cleartext HTTP-трафика на YOUR-API.DOMAIN.COM не допускается (targetSdkVersion = "28"). в ксамарине, ксамарине. Android и студии Android.
Два шага, чтобы решить эту ошибку в студии ксамарин, ксамарин.андроид и андроид.
Шаг 1: Создайте файл ресурсов / xml / network_security_config.xml
В setwork_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">
Создать файл - res / xml / setw_security.xml
В setwork_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">
Убедитесь, что у вас есть следующее в 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" / >
< приложение Android: usesCleartextTraffic = "true" / >
< / edit-config >
Запустите ионную Cordova build android. Создает папку Android под платформами
Откройте Android Studio и откройте папку Android, представленную в нашем проекте Project-платформы-андроид. Оставьте это на несколько минут, чтобы он построил град
После завершения сборки gradle мы получаем некоторые ошибки для включения
minSdVersionв
manifest.xml. Теперь мы просто удаляем
< uses-sdk android: minSdkVersion = "19" / > из
manifest.xml`.
Убедитесь, что он удален из обоих мест:
AndroidManifest.xml
.AndroidManifest.xml
.Теперь попробуйте построить градль снова, и теперь она успешно строится
Убедитесь, что у вас есть следующее в теге приложения в приложении & rarr; манифест & rarr; Androidmanifest.xml
:
& Лт; приложение
android: networkSecurityConfig = "@ xml / network_security_config" android: usesCleartextTraffic = "true" >
Откройте network_security_config
(app & rarr; res & rarr; xml & rarr; network_security_config.xml
).
Добавьте следующий код:
& Лт;?xml version = "1.0" coding = "utf-8"?>
< network-security-config >
< domain-config cleartextTrafficPermitted = "true" >
< домен включает субдомены = "true" > xxx.yyyy.com < / домен >
< / domain-config >
< / network-security-config >
Здесь xxx.yyyy.com
является ссылкой вашего HTTP API. Убедитесь, что вы не включаете Http перед URL .
Примечание. Теперь создайте приложение с помощью Android Studio (Build - Build Bundle's / APK - Build APK), и теперь вы можете использовать это приложение, и оно отлично работает в Android Pie. Если вы попытаетесь создать приложение с помощью ионного Android Cordova build, оно переопределит все эти настройки, поэтому убедитесь, что вы используете Android Studio для создания проекта.
Если у вас установлены более старые версии приложения, удалите их и попробуйте, иначе у вас останется какая-то ошибка:
Приложение не установлено