遵循 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 接收有效)。我们怀疑这可能是造成这种虚假接收问题的原因。由于似乎授权对话框只在发送数据时显示,我们配置我们的应用程序将数据发送到本地网络以尝试触发对话框,使用以下所有方法: