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

Posted

技术标签:

【中文标题】新 WCSessionDelegate 方法在早期版本的 iOS 和 watchOS 上的行为【英文标题】:Behaviour of new WCSessionDelegate methods on earlier versions of iOS and watchOS 【发布时间】:2016-04-06 06:26:35 【问题描述】:

我正在实现新的 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 设备的组合?

【问题讨论】:

【参考方案1】:

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

例如,用户可以安装或删除伴侣手表应用,或者在当前活跃的手表上启用或禁用复杂功能。

支持旧版本的 iOS:

委托方法本身不会在旧版本的操作系统上被调用。您只需要确保您不访问任何属性或调用任何仅在较新版本的操作系统上可用的方法。

您应该在use #if available to dynamically check the OS version 上运行您的应用程序(因为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,您可能会发现它有助于支持或尝试手表切换。

【讨论】:

以上是关于新 WCSessionDelegate 方法在早期版本的 iOS 和 watchOS 上的行为的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使实现了所有必需的方法,Class 也不会确认协议“WCSessionDelegate”错误

WKWatchConnectivityRefreshBackgroundTask 与 WCSessionDelegate 竞争

WatchOS 2.0:WCSessionDelegate 没有被调用(在模拟器中)

在后台将数据从 iWatch 发送到 iPhone

我如何重新训练模型而不会丢失带有新数据集的早期模型数据

新研究调查Masimo ORi™能否对ICU患者气管插管期间的低氧血症发出早期警示