WCSessionDelegate:sessionDidBecomeInactive和sessionDidDeactivate已被标记为不可用,但是是必需的

时间:2016-09-15 14:17:24

标签: watchkit swift3 xcode8 wcsession

我刚刚使用Xcode 8的转换函数将Swift 2应用程序转换为Swift 3。

我的代码有一个标记为WCSessionDelegate的类。

在Swift 2中,它编译时没有方法sessionDidBecomeInactivesessionDidDeactivate

如果我编译Swift 3版本,编译器会抱怨我的类不符合协议WCSessionDelegate,这显然是正确的。
然后它提供插入两个函数的存根:

public func sessionDidBecomeInactive(_ session: WCSession) { }  
public func sessionDidDeactivate(_ session: WCSession) { }

插入这些存根后,会报告以下错误:

Cannot override 'sessionDidBecomeInactive' which has been marked unavailable  
Cannot override 'sessionDidDeactivate' which has been marked unavailable  

如何解决此问题?

1 个答案:

答案 0 :(得分:24)

由于委托方法sessionDidDeactivatesessionDidBecomeInactive在watchOS上被标记为不可用,因此您必须使编译器忽略共享类中的这些代码段。您可以使用以下预处理器宏执行此操作:

#if os(iOS)
public func sessionDidBecomeInactive(_ session: WCSession) { }  
public func sessionDidDeactivate(_ session: WCSession) {
    session.activate()
}
#endif

另请注意,我在activate来电中添加了sessionDidDeactivate来电。这是当用户从一个配对的手表切换到第二个配对的手表时重新激活手机上的会话。像这样调用它假设您没有其他线程/代码的一部分需要在切换发生之前给出时间。有关支持快速切换功能的更多信息,请查看Apple sample code