Приложение Xamarin.iOS запрашивает разрешение локальной сети в iOS 14.0

#ios #xamarin #xamarin.ios #ios14 #ios-permissions

#iOS #xamarin #xamarin.ios #ios14 #ios-разрешения

Вопрос:

У меня есть приложение Xamarin.iOS, которое запрашивает разрешение локальной сети при запуске на устройствах iOS 14. Приложение не использует какую-либо службу Bonjour и не использует ничего специфичного для локальной сети. Приложение имеет различные пакеты nuget, включая Xamarin.Essentials, MvvmCross, Firebase services, Realm DB и т. Д.

Я прошел через различные открытые потоки на developer.apple.com включая видео WWDC2020, но все еще не понял, что вызывает это диалоговое окно разрешения.

Ответ №1:

После множества проб и ошибок мы, наконец, смогли определить точку запуска разрешения локальной сети.

  • Это приглашение запускается из-за метода проверки SSHConnection, который мы используем для выявления взломанных устройств iPhone.
  • Этот метод проверяет, пытаются ли SSH-клиенты установить соединение с 127.0.0.1 (localhost) на порту 22, Если соединение выполнено успешно, устройство находится в тюрьме. сломан.
  • Этот код вызывает запрос разрешения CrossConnectivity.Current.IsRemoteReachable("127.0.0.1", 22, 5000);

Комментарии:

1. Этот код показывает диалоговое окно разрешения локальной сети только тогда, когда устройство подключено к Wi-Fi. Я думаю, что плагин CrossConnectivity не отправляет запрос при отсутствии соединения.

Ответ №2:

Итак, мое приложение использует связь с сокетами, и при первом подключении приложения пользователю предлагается ввести это приглашение с разрешениями. К сожалению, это приводит к сбою моей первой попытки подключения к сокетам. Чтобы обойти это, я добавляю следующий код в самом начале жизненного цикла моего приложения. (У меня есть страница конфигурации, которая всегда отображается при первом запуске приложения, поэтому я добавил ее туда.) Затем этот код запрашивает разрешения. Одна вещь, которую я отметил, это то, что если я не использовал тот же IP-адрес / порт при принудительном вызове запроса, который я буду использовать позже для подключения к сокету, мне было предложено ввести разрешения во ВТОРОЙ раз. (Я использовал IP-адрес 192.0.0.1 и порт 20.) Это было довольно неприятно. Похоже, я также не смог найти способ проверить наличие этого разрешения

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

     public async static void ForcePermissions(string ps_IPAddress, int pi_Port)
    {
        try
        {

            IPAddress ipAddress = IPAddress.Parse(ps_IPAddress);
            //This is only done to force the local network permissions access in iOS 14. 
            IPEndPoint remoteEndPoint = new IPEndPoint(ipAddress, pi_Port);

            // Create a TCP/IP socket.  
            var client = new Socket(ipAddress.AddressFamily,
                                SocketType.Stream, ProtocolType.Tcp);

            var lb_ReturnValue = await client.ConnectAsync(remoteEndPoint).ConfigureAwait(false);

        }
        catch (Exception ex)
        {
            App.ProcessException(ex);
        }
    }