如何使用 iOS 14 触发多播权限的本地网络对话授权

Dan*_*kis 6 networking multicast entitlements ios ios14

遵循 iOS 14 阻止访问本地网络的新策略,访问本地网络需要 com.apple.developer.networking.multicast 特殊权限,并且此访问应由用户在授权对话框中确认。虽然这个新功能没有被彻底记录下来,但苹果工程师在论坛上表示,这个授权对话框弹出窗口只在应用尝试发送流量时触发,导致应用只读取网络的问题,如iOS 14 如何触发本地网络对话并检查用户回答?

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

我们的应用程序通常只接收 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中指示的LocalNetworkPermissionService类的triggerDialog()方法如何触发本地网络对话框并检查用户答案?

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

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

Dan*_*kis 5

感谢@Columbo 和 Apple 的帮助,尽管问题的根本原因尚未完全清楚,但已经找到了解决方案。

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

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

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

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