iOS 和 watchOS 早期版本上新 WCSessionDelegate 方法的行为

Behaviour of new WCSessionDelegate methods on earlier versions of iOS and watchOS

我正在实施新的 WCSessionDelegate 方法以支持多设备配对。

- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(nullable NSError *)error;
- (void)sessionDidBecomeInactive:(WCSession *)session;
- (void)sessionDidDeactivate:(WCSession *)session;

我有点不确定这些方法如何与旧版本的 iOS 和 watchOS 一起使用(事实证明模拟器非常无用)。

我的假设是这些方法将取代通过下面的方法控制的行为,我可以排除它吗?

- (void)sessionWatchStateDidChange:(WCSession *)session;

有没有人有使用这些新方法支持旧 iOS 和 watchOS 设备组合的经验?

新的会话激活方法不会替换状态更改方法。您将继续收到活动手表的状态更改通知,因为某些 属性 更改可能与正在切换的手表无关。

例如,用户可以安装或删除配套手表应用程序,或者启用或禁用当前活动手表上的复杂功能。

支持旧版本 iOS:

委托方法本身不会在旧版本的 OS 上被调用。您只需要确保您不访问任何属性或调用任何仅在 OS.

的较新版本上可用的方法。

您应该 您的应用已 运行 开启(因为 activationState 仅在 9.3 之后可用)。

这是一个示例,演示如何支持 iOS 的多个版本:

private func isValidSession() -> Bool {
    if #available(iOS 9.3, *) {
        guard let session = session where session.activationState == .Activated && session.paired && session.watchAppInstalled else {
            return false
        }
    } else {
        // Fallback on earlier versions
        guard let session = session where session.paired && session.watchAppInstalled else {
            return false
        }
    }
    return true
}

示例代码:

Apple 还提供了 QuickSwitch sample code,您可能会发现它有助于支持或试验手表切换。