【问题标题】:How to trigger the local network dialog authorization for multicast entitlement using iOS 14如何使用 iOS 14 触发多播权限的本地网络对话授权
【发布时间】: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


【解决方案1】:

感谢@Columbo 和 Apple 的帮助,我们找到了解决方案,但尚未完全了解问题的根本原因。

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

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

当然,对于必须从头重新安装应用程序并重新配置的用户来说,此过程并不理想。如果未来的 iOS 版本避免了这个问题,我会更新这个帖子。

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

【讨论】:

  • 大家好,我们遇到了类似的问题,并在此处的 Apple 论坛帖子中讨论 developers.apple.com/forums/thread/666179?page=1#645696022
  • @Nick T,感谢您的指点。我们从爱斯基摩人那里得到了很大的帮助,我们的应用现在可以在更新后正确触发网络隐私授权对话框,但仅限于 iOS 14.2
【解决方案2】:

对于那些突然发现APP要求这个授权的人,不要以为它会出现。答案可能是您的 APP 尝试连接到您的测试服务器,该服务器与您运行 iOS 14 的 iPhone 在同一局域网中。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-13
      • 2021-01-12
      • 2021-05-03
      • 2023-03-31
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多