【发布时间】:2021-01-26 05:17:22
【问题描述】:
根据 iOS 14 阻止访问本地网络的新政策,访问本地网络需要 com.apple.developer.networking.multicast 特殊权限,并且此访问权限应由用户在授权对话框中确认。虽然这项新功能没有完整记录,但苹果工程师在论坛中表示,此授权对话框弹出仅在应用尝试发送流量时触发,导致应用只读取网络的问题,如 iOS 14 How to trigger Local Network dialog and check user answer? 所示
不幸的是,发送一些数据来触发授权对话框的建议在我们的案例中似乎不起作用,因为我们从未出现过弹出对话框。
我们的应用通常只接收 UDP 广播(除少数情况外不发送)。我们已获得 com.apple.developer.networking.multicast 权利,已将其添加到我们的应用程序权利中,已将请求的 NSLocalNetworkUsageDescription 添加到我们的 Info.plist 中,并正在使用 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 上的授权对话框,并且我们的应用仍未在 Privacy/Local Network 中列为已授权,并且虚假接收 UDP 数据包。
如果有人遇到同样的问题并找到了解决方案,非常感谢您的建议。
【问题讨论】:
-
你见过developer.apple.com/forums/thread/663858吗? FAQ-2 表示您不需要多播接收的权限,但您很快就会这样做。 FAQ-8 建议了一种触发警报的方法(可能是您尝试过的那个)。另外,当对话框没有出现时,您是否尝试过卸载/重新安装?
-
@Columbo 感谢您的回复。是的,我们正在密切关注这个线程并实施了他们推荐的解决方案来触发警报,但无济于事。但是按照您关于卸载/重新安装的建议,我们终于做到了,并且成功了!非常感谢您的帮助。但是,对于我们的用户来说,这个解决方案实施起来会很复杂,因为我们的应用程序存储了大量数据,从头开始重新安装和恢复数据将是一项耗时的操作。应该完全卸载/再次安装现有应用程序以显示网络对话框授权是不正常的。
标签: ios networking multicast ios14 entitlements