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

12

我刚刚使用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  

我该如何解决这个问题?


你添加了 deactivateinactive 回调函数的类;它是否被编译并用于 iOS 应用程序和 WatchKit 扩展? - ccjensen
@ccjensen:是的,这个类是共享的。 - Reinhard Männer
@ccjensen:如果类只有watch扩展作为目标,则问题仍然存在。 - Reinhard Männer
1个回答

47

由于在watchOS中,委托方法sessionDidDeactivatesessionDidBecomeInactive被标记为不可用,因此您需要让编译器忽略共享类中的这些代码。您可以使用以下预处理器宏来实现:

#ifndef TARGET_OS_WATCH // your code for sessionDidDeactivate and sessionDidBecomeInactive on iOS/tvOS here #endif
#if os(iOS)
public func sessionDidBecomeInactive(_ session: WCSession) { }  
public func sessionDidDeactivate(_ session: WCSession) {
    session.activate()
}
#endif
请注意,我在`sessionDidDeactivate`调用中添加了`activate`调用。这是为了在用户从一个配对的手表切换到另一个配对的手表时重新激活手机上的会话。这样调用假定您没有其他需要在切换发生之前给予时间的线程/代码部分。有关支持快速手表切换的更多信息,请查看苹果的示例代码

感谢您的努力,但建议的代码改进并未消除编译器错误,请看我上面的编辑。 - Reinhard Männer
谢谢,我早上一直在这个问题上纠结了很久。 - smercer
类似函数的宏“os”未定义。 - Erika Electra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接