iOS 权限和发现

从 iOS 14 开始,操作系统将强制执行新的限制和权限,以影响 Cast 用户体验。它还会影响将 Cast SDK 构建到应用中的方式。为了让您的应用在最新版 iOS 中保持 Cast 功能,您必须进行更新以处理这些权限变更。

iOS 14

开发者应将其 iOS Cast 发送器应用更新到 Google Cast SDK v4.6.0 或更高版本。这些版本支持 iOS 14 及其要求。

从 iOS 14 开始,在本地网络上扫描设备的应用现在会通过一次性权限对话框提示用户查找并连接到本地网络设备。Cast 平台使用本地网络发现和控制 Cast 设备,因此如果用户拒绝授予权限,他们将无法进行投屏。

为了提升用户体验,我们将针对那些使用标准设备选择器的应用,对 SDK 进行一些用户体验修改。通过这些用户体验调整,用户可以更清楚地了解需要本地网络访问权限的原因,以及如何在本地网络设备访问权限已停用的情况下启用投射。

使用 Cast SDK 版本(4.4.8 或更低版本)构建的应用只要使用 Xcode 11.7 或更低版本构建而成,就可以继续运行。如果您使用 Xcode 12 或更高版本针对 iOS 14 进行构建,我们建议您更新到 Cast SDK v4.6.0 或更高版本,以确保您的 Cast 应用继续正常运行。

您可以通过 CocoaPods 按照 CocoaPods 设置下载 Cast iOS SDK v4.6.0 或更高版本,也可以按照手动设置手动下载。此版本对底层发现机制进行了更改,以允许使用 Xcode 12 构建的应用在网络上查找 Cast 设备。现在,“投射”按钮应始终显示。如果用户点按“投放”按钮时没有可用的设备,系统会显示一个对话框,说明设备不可用的原因,包括有关如何重新启用本地网络访问权限的信息。

Cast SDK 变更

首次投放

当用户首次尝试进行投屏时,系统会显示一个本地网络访问权限 (LNA) 插页对话框,说明需要本地网络访问权限的原因,然后是 Apple 提供的 iOS 本地网络访问权限提示。下面的模拟演示了该流程:

本地网络访问权限流程

无法投放

从 iOS 发送器 SDK 4.6.0 开始,当用户连接到 Wi-Fi 时,“投射”按钮将始终显示。当 Cast 设备不可用时,点按“投放”按钮会打开一个对话框,向用户说明 Cast 不可用的可能原因,如下面的模拟所示:

“Flow with Cast”功能无法使用

在 iOS 14 上更新应用

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

    如果使用 CocoaPods,请使用 pod update 将 4.8.0 SDK 添加到您的项目中。

    否则,请 手动拉取 SDK

  2. NSBonjourServices 添加到您的 Info.plist

    Info.plist 中指定 NSBonjourServices 以允许在 iOS 14 上成功执行本地网络发现。

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

    appID 是您的接收器 ID,与GCKDiscoveryCriteria 中定义的 ID 相同。

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

    <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} 使用本地网络发现您的 Wi-Fi 网络上支持 Cast 的设备。</string>

    此消息将作为 iOS“本地网络访问”对话框的一部分显示,如模拟中所示。

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

    我们还建议您尽快使用 4.8.0 重新发布应用。

自定义设置

启动投射设备发现

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

您可以使用一个新标志控制设备发现功能何时启动以及用户体验中某些元素的行为:

startDiscoveryAfterFirstTapOnCastButton: BOOL(true/false)

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

如果设为 true,当用户首次点按 GCKUICastButton 时,系统会启动 Cast 设备发现操作。系统会向用户显示一条信息性消息,让用户知道为什么需要本地网络权限。该消息之后,系统会显示 iOS 14 LNA 消息。确认消息后,便会启动投放设备发现。

在后续的应用启动时,系统始终会显示 GCKUICastButton

如果此政策设为 false,系统将根据 GCKCastOptions::disableDiscoveryAutostart 标志的值启动设备发现。

常见问题解答

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

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

如果我使用新的 Cast SDK 重新发布应用,那么在 iOS 13 或更低版本上运行的用户将有何体验?

用户获得的体验与重新发布应用之前的体验相同。用户可见的更改仅限于运行 iOS 14 的用户。

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

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

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

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

进行这项更改的原因是,在首次扫描应用后,系统会显示本地网络访问 (LNA) 权限提示。这可能会导致权限对话框出现在应用中的随机位置。

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

iOS 13

iOS 13 引入了新的权限要求,这会影响使用 Google Cast SDK 的应用。

从 Google Cast SDK v4.4.3 开始,我们推出了一个无需 Bluetooth®(蓝牙)权限的其他 SDK。您可以在开发者网站和新的 google-cast-sdk-no-bluetooth Cocoapods 上找到此 API。

应用细分

下面根据您当前使用的 iOS SDK 版本进行了细分:

使用 iOS 12 SDK 或更低版本构建的应用

  • 建议采取的行动。在 iOS 13 上运行时,设备发现性能可能会下降,但仍会正常运行。强烈建议开发者升级到 Cast SDK v4.4.4(如有)。
  • iOS 13 将提示用户向应用授予 Bluetooth® 权限。

使用 iOS 13 SDK 构建的应用

  • 建议采取的行动:请更新到 Cast SDK 4.4.4,否则,如果用户未授予位置权限,投放按钮可能不会显示。必须升级到 Cast SDK 4.4.4,以确保在 iOS 13 上提供可靠的投放体验。