新 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 竞争