如何使用iOS 14

问题描述

根据iOS 14的新政策,禁止访问本地网络,需要com.apple.developer.networking.multicast特殊权利才能访问本地网络,并且此访问应由用户在授权对话框中确认。尽管尚未对此新功能进行详尽的记录,但Apple工程师在论坛上指出,仅当应用尝试发送流量时才会触发此授权对话框弹出窗口,从而导致仅读取网络的应用出现问题,如iOS 14 How to trigger Local Network dialog and check user answer?

不幸的是,在我们的案例中,发送一些数据以触发授权对话框的建议似乎不起作用,因为我们从未出现过弹出对话框。

我们的应用程序通常仅接收UDP广播(除了少数情况,不发送)。我们已获得com.apple.developer.networking.multicast权利,已将其添加到我们的应用程序权利中,已在Info.plist中添加了所请求的NSLocalNetworkUsageDescription,并使用XCode 12.0手动配置了我们的应用程序,其配置文件包括该权利(在这种情况下,需要手动进行代码签名,如https://developer.apple.com/forums/thread/656773?answerId=628537022中所述)。从那时起,情况有所改善,因为在添加权利之前被完全阻止的UDP数据包接收有时开始起作用,但不幸的是并非总是如此(iOS 14.0.1的情况似乎比iOS 14和iPhone的情况比iPad差)。

最重要的是,我们从未显示过授权对话框,并且我们的应用程序未在“隐私/本地网络”中显示为已授权(即使UDP接收有效)。我们怀疑这可能是造成此伪造接收问题的原因。似乎授权对话框仅在发送数据时显示,我们使用以下所有方法将应用程序配置为将数据发送到本地网络,以尝试触发该对话框:

  • Tcpsocket类(使用CFStreamCreatePairWithSocketToHost)连接到端口80上的192.168.1.1并发送一些字节(此地址处有一个设备)
  • 使用GCDAsyncSocket连接测试TCP数据包并将其发送到相同的地址/端口
  • 使用GCDAsyncUdpSocket创建UDP套接字,使其能够广播,然后加入MulticastGroup 224.0.1.0并在端口80上广播测试UDP数据包。
  • 使用GCDAsyncUdpSocket创建UDP套接字,使其能够广播,然后在端口80上将测试UDP数据包广播到255.255.255.255。
  • 重用Apple文章https://developer.apple.com/news/?id=0oi77447中的示例),将带有NWConnectionGroup的多播数据包发送到224.0.1.0。
  • 最后使用iOS 14 How to trigger Local Network dialog and check user answer?中指示的LocalNetworkPermissionService类的triggerDialog()方法

以上操作均未触发iOS 14.0和iOS 14.0.1上的授权对话框,并且我们的应用仍未在“隐私/本地网络”中列为已授权,并且会虚假接收UDP数据包。

如果有人遇到相同的问题并找到了解决方案,非常感谢您的建议。

解决方法

由于@Columbo和Apple的帮助,已经找到了解决方案,尽管该问题的根本原因尚未完全理解。

我们的应用程序的iOS版本部署目标是9.0,因为我们试图保持与旧设备的兼容性。较低的部署目标12.0可能会导致网络隐私管理出现问题。解决方案是:

  • 在将iOS部署目标更新为12.0或更高版本后重建应用程序。
  • 对于已安装了该应用程序先前版本的所有iOS 14.0和14.0.1设备,要完全删除该应用程序并再次安装(更新该应用程序还不够,仍然不会显示网络隐私警报)。 / li>

当然,此过程对于必须从头开始重新安装应用程序并重新配置的用户而言并不理想。如果将来的iOS版本可以避免此问题,我将更新此线程。

更新:使用iOS 14.2时,即使在升级后(未完全删除并重新安装),该应用程序仍会正确触发网络隐私警报。然后,我们建议用户在升级我们的应用程序之前先升级到14.2。我们将部署目标保持在12.0

,

对于那些突然发现该APP的用户,请询问此授权,并且不要以为它会出现。答案是,也许您的APP试图连接到与运行iOS 14的iPhone在同一局域网中的测试服务器。

,

对于 14.2,本地网络访问的处理稍好一些,并且有一个示例代码用于触发此警报,如 https://developer.apple.com/forums/thread/663768

中所述

您也可以使用 NWConnection 创建虚拟连接,这将触发系统对话框请求权限(如果之前没有显示系统对话框)并检查本地网络访问是否允许,如 https://developer.apple.com/forums/thread/663769 所述,这可从 iOS 14.2 获得。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...