Xamarin.iOS 应用在 iOS 14.0 中请求本地网络许可
Xamarin.iOS app asking Local Network permission in iOS 14.0
我有 Xamarin.iOS 正在生产的应用程序,它在 iOS 14 台设备上启动时请求本地网络许可。应用程序未使用任何 Bonjour 服务,也未使用任何特定于本地网络的内容。应用程序有各种 nuget 包,包括 Xamarin.Essentials、MvvmCross、Firebase 服务、Realm DB 等
我已经浏览了 developer.apple.com 上的各种开放线程,包括 WWDC2020 video,但仍然没有明白是什么触发了这个权限对话框。
经过多次尝试和错误,我们终于能够识别本地网络权限触发点。
- 此提示是由于我们的 SSHConnection 检查方法而触发的
用于识别越狱的 iPhone 设备。
- 此方法检查 SSH 客户端是否尝试在端口 22 上连接到 127.0.0.1(localhost) 如果连接成功,则设备已越狱。
- 此代码导致权限提示
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);
}
}
我有 Xamarin.iOS 正在生产的应用程序,它在 iOS 14 台设备上启动时请求本地网络许可。应用程序未使用任何 Bonjour 服务,也未使用任何特定于本地网络的内容。应用程序有各种 nuget 包,包括 Xamarin.Essentials、MvvmCross、Firebase 服务、Realm DB 等
我已经浏览了 developer.apple.com 上的各种开放线程,包括 WWDC2020 video,但仍然没有明白是什么触发了这个权限对话框。
经过多次尝试和错误,我们终于能够识别本地网络权限触发点。
- 此提示是由于我们的 SSHConnection 检查方法而触发的 用于识别越狱的 iPhone 设备。
- 此方法检查 SSH 客户端是否尝试在端口 22 上连接到 127.0.0.1(localhost) 如果连接成功,则设备已越狱。
- 此代码导致权限提示
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);
}
}