Как запустить авторизацию диалогового окна локальной сети для разрешения многоадресной рассылки с помощью iOS 14

В соответствии с новой политикой блокировки доступа к локальной сети 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-пакетов.

Если кто-то столкнулся с такой же проблемой и нашел решение, большое спасибо за ваш совет.


person Daniel Mavrakis    schedule 11.10.2020    source источник
comment
Вы видели developer.apple.com/forums/thread/663858? FAQ-2 указывает на то, что вам не нужно разрешение для многоадресного приема, но вскоре оно вам понадобится. FAQ-8 предлагает способ активировать предупреждение (возможно, тот, который вы пробовали). Кроме того, если диалоговое окно не появляется, пробовали ли вы удалить / переустановить?   -  person Columbo    schedule 15.10.2020
comment
@Columbo, спасибо за ответ. Да, мы внимательно следим за этой веткой и безрезультатно реализовали рекомендованное ими решение для запуска предупреждения. Но, следуя вашему совету по удалению / переустановке, мы, наконец, сделали это, и это сработало! Большое спасибо за вашу помощь. Однако это решение будет сложно реализовать для наших пользователей, потому что в нашем приложении хранится много данных, а переустановка с нуля и восстановление данных потребуют много времени. Это не нормально, что существующее приложение должно быть полностью деинсталлировано / снова установлено, чтобы появилась авторизация сетевого диалога.   -  person Daniel Mavrakis    schedule 17.10.2020


Ответы (3)


Благодаря @Columbo и помощи Apple решение было найдено, хотя основная причина проблемы еще не до конца понятна.

Наше приложение было создано с целью развертывания выпуска iOS 9.0, потому что мы пытались сохранить совместимость со старыми устройствами. Похоже, что цель развертывания ниже 12.0 может вызвать проблемы с управлением конфиденциальностью сети. Решение было таким:

  • , чтобы перестроить приложение после обновления целевого объекта развертывания iOS до 12.0 или выше.
  • для всех устройств iOS 14.0 и 14.0.1, на которых уже установлена ​​предыдущая версия приложения, чтобы полностью удалить приложение и установить его снова (обновления приложения было недостаточно, предупреждение о конфиденциальности сети по-прежнему не отображалось).

Конечно, эта процедура не идеальна для пользователей, которым придется переустанавливать приложение с нуля и заново настраивать его. Я обновлю эту тему, если в будущей версии iOS эта проблема будет устранена.

Обновление: при использовании iOS 14.2 приложение правильно запускает оповещение о конфиденциальности сети даже после обновления (без полного удаления и повторной установки). Затем мы порекомендовали нашим пользователям обновиться до 14.2 перед обновлением нашего приложения. Мы сохранили цель развертывания на уровне 12.0.

person Daniel Mavrakis    schedule 23.10.2020
comment
Привет всем, у нас есть похожие проблемы, и мы обсуждаем их в ветке форумов Apple здесь developers.apple.com/forums/thread/666179?page=1#645696022. - person Nick T; 11.11.2020
comment
@Nick T, спасибо за указатель. Мы получили большую помощь от Eskimo, и наше приложение теперь корректно запускает диалог авторизации сетевой конфиденциальности после обновления, но только в iOS 14.2. - person Daniel Mavrakis; 12.11.2020

Тем, кто внезапно обнаружит, что приложение запрашивает разрешение, не предполагая, что оно появится. Ответ заключается в том, что, возможно, ваше приложение пытается подключиться к вашему тестовому серверу, который находится в той же локальной сети, что и ваш iPhone под управлением iOS 14.

person Guang Chow    schedule 23.11.2020

В версии 14.2 доступ к локальной сети обрабатывается немного лучше, и для запуска этого предупреждения используется образец кода, как указано в https://developer.apple.com/forums/thread/663768

Также вы можете создать фиктивное соединение с помощью NWConnection, это вызовет системный диалог для запроса разрешения (если системный диалог не отображается ранее) и проверьте, разрешен ли доступ к локальной сети, как указано в https://developer.apple.com/forum/thread/663769, это доступно в iOS 14.2.

person Nandish    schedule 30.03.2021