iOS 权限和发现

现在,扫描本地网络中设备的应用会向用户显示一个单次授权对话框,以查找并连接到本地网络设备。Cast 平台使用本地网络来发现和控制 Cast 设备,因此如果用户拒绝授予权限,将无法进行投放。

为了改善用户体验,我们正在对使用标准设备选择器的应用的 SDK 进行一些用户体验修改。这些用户体验修改可让用户更清楚地了解为何需要本地网络访问权限,以及在本地网络设备访问权限已被停用的情况下如何启用投屏功能。

您可以使用 Swift Package Manager 添加 Cast iOS SDK v4.6.0 或更高版本,方法是按照 Swift Package Manager 设置中的说明操作,或按照手动设置中的说明手动下载。此版本对底层发现机制进行了更改,以便使用 Xcode 12 构建的应用能够在网络上找到 Cast 设备。现在,“投放”按钮应该始终显示。如果用户点按“投放”按钮时没有可用设备,系统会显示一个对话框,说明设备可能不可用的原因,包括如何重新启用本地网络访问权限。

Cast SDK 变更

首次投屏

用户首次尝试投放时,系统会显示本地网络访问权限 (LNA) 插页式对话框,说明需要本地网络访问权限的原因,然后显示 Apple 提供的 iOS 本地网络访问权限提示。以下模拟图展示了该流程:

本地网络访问权限流程

无法投屏

从 iOS 发送端 SDK 4.6.0 开始,当用户连接到 Wi-Fi 时,系统始终会显示“投放”按钮。当没有可用的投放设备时,点按“投放”按钮会弹出一个对话框,向用户提示投放功能不可用的可能原因,如以下模拟图所示:

无法使用 Cast 流程

更新应用

  1. 将 Cast iOS SDK 4.8.6 添加到您的项目中

    如果使用 Swift Package Manager,请将 google-cast-ios-sdk 软件包更新到 4.8.6 版。

    否则,请 手动拉取 SDK。

  2. 将 NSBonjourServices 添加到 Info.plist

    在 Info.plist 中指定 NSBonjourServices,以便成功发现本地网络。

    您需要同时添加 _googlecast._tcp 和 _<your-app-id>._googlecast._tcp 作为服务,设备发现功能才能正常运行。

    appID 是您的 receiverID,与 GCKDiscoveryCriteria 中定义的 ID 相同。

    更新以下示例 NSBonjourServices 定义,并将“ABCD1234”替换为您的 appID。

    <key>NSBonjourServices</key>
    <array>
      <string>_googlecast._tcp</string>
      <string>_ABCD1234._googlecast._tcp</string>
    </array>
  3. 将 NSLocalNetworkUsageDescription 添加到 Info.plist

    我们强烈建议您在应用的 Info.plist 文件中为 NSLocalNetworkUsageDescription 添加应用专属权限字符串,以自定义本地网络提示中显示的消息,例如描述 Cast 发现和其他发现服务(如 DIAL)。

    <key>NSLocalNetworkUsageDescription</key>
    <string>${PRODUCT_NAME} uses the local network to discover Cast-enabled devices on your WiFi
    network.</string>

    此消息将显示在 iOS 本地网络访问对话框中,如模拟图所示。

    “投放本地网络访问权限”对话框图片
  4. 将应用重新发布到 Apple App Store

    我们建议您也尽快使用 4.8.6 重新发布应用。

自定义

启动投屏设备发现

默认情况下,当用户首次点按“投放”按钮 (GCKUICastButton) 时,系统会启动投放设备发现功能。如果这是用户首次尝试在本地网络上使用投放应用,系统会先显示新的 LNA 插页式广告,然后显示 iOS 本地网络访问权限对话框。

我们提供了一个新标志,可让您控制设备发现何时开始以及用户体验的某些元素的行为:

startDiscoveryAfterFirstTapOnCastButton: BOOL(true/false)

默认值为 true。此标志仅在标志 GCKCastOptions::disableDiscoveryAutostart 设置为 false 时适用。

如果设置为 true,则当用户首次点按 GCKUICastButton 时,系统会开始发现 Cast 设备。系统会向用户显示一条信息性消息,告知他们为何需要本地网络权限。该消息之后,系统会显示 iOS LNA 消息。 确认消息后,系统会开始发现投放设备。

在后续的应用启动中,GCKUICastButton 始终会显示。

如果设置为 false,设备发现将根据标志 GCKCastOptions::disableDiscoveryAutostart 的值启动。

常见问题解答

如果我使用 Cast SDK v4.4.8 和 Xcode 12 重新发布 Cast 发送器应用,会发生什么情况?

除非您已从 Apple 获得网络多播授权,否则您的应用可能无法在本地网络上发现 Cast 设备。 请注意,Apple 不会仅出于支持 Cast 的目的而授予多播权限。 如果您计划使用 Xcode 12 进行构建,则应使用 Cast 4.6.0 发布应用。

新版 Cast SDK 发布后,我需要做什么来更新我的应用?

  • 更新应用的 Info.plist,以包含本地网络使用说明。
  • 将 NSBonjourServices 添加到应用的 Info.plist,并提供 Cast 的 Bonjour 服务名称和您的应用 ID。
  • 升级您的发送端应用,以使用 Cast SDK 4.6.0。
  • 将应用重新发布到 Apple 应用商店。

为什么升级到 4.6.0 后,设备不再显示在我的自定义设备选择器中?

这是一个已知问题,如果您使用的是自定义设备选择器而不是标准设备选择器,则可能会发生此问题。在 Cast SDK 4.4.8 及更早版本中,设备扫描是自动进行的。从 4.6.0 版开始,您需要对 GCKDiscoveryManager 类显式调用 startDiscovery 方法,以启动设备发现。

之所以做出这项更改,是因为本地网络访问 (LNA) 权限提示将在应用首次扫描后显示。这可能会导致权限对话框随机出现在应用中的各个位置。

如果开发者为自己的应用构建自定义设备选择器,则需要在首次启动设备扫描之前提供一次性插页式广告。