Установка имени домена network_security_config.xml на localhost во время выполнения
Начиная с Android 9, Android по умолчанию разрешает сетевые подключения только через HTTPS. Однако единственные запросы, которые я делаю, выполняются через локальный хост (например,http://10.41.199.226:port/FooBar
), который обрабатывается (C#)HttpListener
прослушивание комбинации адресов: портов.
Поскольку этот запрос выполняется через HTTP, Android по умолчанию не разрешает его. Следуя этой документации Android оnetwork_security_config
файл, я могу разрешить HTTP-соединения, добавив следующие network_security_config.xml
файл
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
Это вызывается из манифеста Android с использованием android:networkSecurityConfig="@xml/network_security_config"
.
Это позволяет выполнить HTTP-запрос, однако, поскольку он устанавливает базовую конфигурацию, он позволяет выполнять HTTP-запросы во всем приложении. Это не очень хорошая идея, потому что я, возможно, захочу добавить исходящие запросы в будущем, которые я хотел бы использовать через HTTPS, и хотел бы, чтобы для этого была создана система безопасности. Сделать это запретным.
Далее в том же документе они вводят domain-config
что позволяет вам установить cleartextTrafficPermitted
в зависимости от домена, который я пробовал со следующими заданными доменами
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">127.0.0.1</domain>
<domain includeSubdomains="true">10.0.0.1</domain>
<domain includeSubdomains="true">localhost</domain>
</domain-config>
</network-security-config>
Без результатов, запросы по-прежнему блокировались из-за отсутствия https.
Я нашел локальный адрес устройства и добавил его в список доменов.
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10.41.199.226</domain> <!--assume this is my local ip -->
</domain-config>
Это сработало, и HTTP был разрешен только при запросе через локальный хост, в то время как любой исходящий запрос потребовал бы HTTPS.
Единственная проблема заключается в том, что у меня нет возможности узнать локальный IP-адрес устройства, на котором будет запущено приложение, до его запуска.
Итак, мой вопрос: есть ли способ:
- Установить для доменного имени то, что будет автоматически регистрироваться как локальный IP-адрес? (что-то типа
localhost
как я пытался, но не получилось) - Добавьте IP-адрес "подстановочного знака", который будет принимать любой IP-адрес в диапазоне 10.xxx (я надеялся, что настройка
includeSubdomains="true"
сделал бы это для меня при добавлении10.0.0.0
адрес. Но это не так) - В качестве последнего средства можно ли отредактировать
network_security_config.xml
файла во время выполнения, поэтому я могу динамически обновить доменное имя одной из записей домена до текущего локального IP-адреса при запуске приложения?
Приложение разработано с использованием Unity 2019.1.8 с использованием среды выполнения сценариев IL2CPP.net 4.x
3 ответа
Самый простой способ реализовать это - использовать этот атрибут в вашем AndroidManifest.xml, где вы разрешаете весь http для всех запросов:
android:usesCleartextTraffic="true"
Но если вы хотите, например, еще несколько конфигураций для разных ссылок, разрешая http для некоторых доменов, но не для других доменов, вы должны предоставить networkSecurityConfig
файл.
Для этого в Android 9 Pie вам нужно будет установить networkSecurityConfig
в вашем манифесте application
тег вроде этого:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
</application>
</manifest>
Затем в вашей xml-папке вам нужно создать файл с именем network_security_config точно так же, как вы назвали его в манифесте, и оттуда содержимое вашего файла должно быть таким, чтобы разрешить все запросы без шифрования:
<?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>
Оттуда вам хорошо идти. Теперь ваше приложение будет запрашивать все типы подключений. Для получения дополнительной информации по этой теме https://developer.android.com/training/articles/security-config.
Попробуйте 1.0.2.2 вместо localhost. Меня устраивает. Источник
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10.0.2.2</domain>
</domain-config>
</network-security-config>
попробуй это
//in AndroidManifest.xml
<application
android:networkSecurityConfig="@xml/network_security_config">
.
</application>
<?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>