我有 Xamarin.iOS 应用程序正在生产中,它在 iOS 14 设备上启动时询问本地网络权限。应用程序未使用任何 Bonjour 服务,也未使用任何特定于本地网络的内容。应用程序有各种 nuget 包,包括 Xamarin.Essentials、MvvmCross、Firebase 服务、Realm DB 等。
我已经浏览了 developer.apple.com 上的各种开放线程,包括WWDC2020 视频,但仍然没有得到触发此权限对话框的原因。
我有 Xamarin.iOS 应用程序正在生产中,它在 iOS 14 设备上启动时询问本地网络权限。应用程序未使用任何 Bonjour 服务,也未使用任何特定于本地网络的内容。应用程序有各种 nuget 包,包括 Xamarin.Essentials、MvvmCross、Firebase 服务、Realm DB 等。
我已经浏览了 developer.apple.com 上的各种开放线程,包括WWDC2020 视频,但仍然没有得到触发此权限对话框的原因。
经过大量试验和错误,我们终于能够识别本地网络权限触发点。
CrossConnectivity.Current.IsRemoteReachable("127.0.0.1", 22, 5000);
因此,我的应用程序使用套接字通信,并且在应用程序第一次创建连接时,会提示用户使用此权限提示。不幸的是,这导致我第一次尝试套接字通信失败。为了解决这个问题,我在应用程序生命周期的最开始添加了以下代码。(我有一个配置页面,它总是在应用程序第一次启动时显示,所以我在那里添加了它。)然后这段代码强制权限提示。我注意到的一件事是,如果我在强制提示时没有使用相同的 ipaddress / 端口,因为我稍后将使用它来建立我的套接字连接,我会被提示第二次权限。(我使用的是 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);
}
}