В соответствии с новой политикой блокировки доступа к локальной сети iOS 14, для доступа к локальной сети требуется специальное разрешение com.apple.developer.networking.multicast, и этот доступ должен быть подтвержден пользователем во время диалога авторизации. Хотя эта новая функция не задокументирована полностью, инженеры Apple указали на форумах, что это всплывающее диалоговое окно авторизации запускается только тогда, когда приложение пытается отправить трафик, что вызывает проблему для приложений, считывающих только сеть, как указано в iOS 14 Как вызвать диалог локальной сети и проверить ответ пользователя? < / а>
К сожалению, совет отправить некоторые данные для запуска диалогового окна авторизации, похоже, не работает в нашем случае, так как всплывающее диалоговое окно никогда не появлялось.
Наше приложение обычно принимает только широковещательную рассылку UDP (без передачи, за исключением некоторых случаев). У нас есть право com.apple.developer.networking.multicast, мы добавили его в наши права на приложения, добавили запрошенное NSLocalNetworkUsageDescription в наш Info.plist и подписываем наше приложение вручную с помощью XCode 12.0 с профилем обеспечения, включающим это право ( В этом случае требуется ручная подпись кода, как указано в https://developer.apple.com/forums/thread/656773?answerId=628537022). С тех пор ситуация несколько улучшилась, поскольку прием UDP-пакетов, который был полностью заблокирован перед добавлением прав, иногда начинал работать, но, к сожалению, не всегда (ситуация кажется хуже на iOS 14.0.1, чем на iOS 14, а на iPhone, чем на iPad).
Самое главное, у нас никогда не отображалось диалоговое окно авторизации, и наше приложение не отображается как авторизованное в конфиденциальности / локальной сети (даже когда прием UDP работает). Мы подозреваем, что это может быть причиной ложной проблемы с приемом. Поскольку кажется, что диалог авторизации отображается только при отправке данных, мы настроили наше приложение для отправки данных в локальную сеть, чтобы попытаться вызвать диалог, используя все следующие методы:
- Класс TcpSocket (с использованием CFStreamCreatePairWithSocketToHost) для подключения к 192.168.1.1 через порт 80 и отправки нескольких байтов (по этому адресу есть устройство)
- использование GCDAsyncSocket для подключения и отправки тестового TCP-пакета на тот же адрес / порт
- используя GCDAsyncUdpSocket для создания сокета UDP, включив его для широковещательной рассылки, затем присоединитесь кMulticastGroup 224.0.1.0 и отправив тестовый пакет UDP на порт 80.
- с помощью GCDAsyncUdpSocket для создания сокета UDP, включения его для широковещательной передачи, а затем широковещательной передачи тестового пакета UDP на порт 80 на 255.255.255.255.
- повторное использование примера из статьи Apple (https://developer.apple.com/news/?id=0oi77447) отправка многоадресных пакетов с NWConnectionGroup на 224.0.1.0
- и, наконец, используя метод triggerDialog () класса LocalNetworkPermissionService, указанный в iOS 14 Как вызвать диалог локальной сети и проверить ответ пользователя?
Ни одно из вышеперечисленных действий не вызвало диалоговое окно авторизации в iOS 14.0 и iOS 14.0.1, и наше приложение по-прежнему не указано как авторизованное в Конфиденциальности / локальной сети с ложным приемом UDP-пакетов.
Если кто-то столкнулся с такой же проблемой и нашел решение, большое спасибо за ваш совет.