#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);
}
}