Поскольку 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 и хотел бы, чтобы для этого была установлена безопасность net. Делая это нет- go.
Далее в том же документе они вводят 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 off устройство, которое будет запускать приложение до его запуска.
Так что мой вопрос, есть ли способ:
- Установить имя домена на что-то что будет автоматически регистрироваться как локальный ip? (что-то вроде
localhost
, как я пытался, но это не сработало)
- Добавьте «подстановочный» IP-адрес, который будет принимать любой IP-адрес в диапазоне 10.xxx (я надеялся, настройка
includeSubdomains="true"
сделает это для меня при добавлении адреса 10.0.0.0
. Но это не так)
- В качестве окончательного варианта можно ли редактировать файл
network_security_config.xml
во время выполнения, поэтому Могу ли я динамически обновлять имя домена одной из записей домена до текущего локального IP-адреса при запуске приложения?
Приложение разработано с использованием Unity 2019.1.8 с использованием. net 4.x IL2 CPP среда выполнения сценариев