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

WCSessionDelegate: sessionDidBecomeInactive and sessionDidDeactivate have been marked unavailable, but are required

我刚刚将一个Swift 2 应用程序转换为Swift 3,使用Xcode 8 的转换功能。

我的代码有一个 class 标记为 WCSessionDelegate

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

如果我编译 Swift 3 版本,编译器会抱怨我的 class 不符合协议 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  

我该如何解决这个问题?

因为委托方法 sessionDidDeactivatesessionDidBecomeInactive 在 watchOS 上被标记为不可用,您将不得不让编译器忽略共享 class 中的那些代码片段。您可以使用以下预处理器宏来执行此操作:

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

另请注意,我在 sessionDidDeactivate 调用中添加了 activate 调用。这是为了在用户从一只配对手表切换到第二只配对手表时重新激活 phone 上的会话。像这样调用它假设您的代码中没有其他 threads/part 需要在切换发生之前给定时间。有关支持快速手表切换的更多信息,您应该查看 Apple sample code