我遇到了WatchOS的一个奇怪问题(但我想这个问题与iOS和OSX类似)。
我使用单例处理WCSession
委托(完整代码由NatashaTheRobot提供,我只在此处粘贴她的部分代码,完整代码为here)。
该类具有startSession
函数,其中单例作为会话的委托关联:
func startSession() {
session?.delegate = self
session?.activateSession()
}
并且所有委托函数都在同一个类中定义,例如session:didReceiveMessage:replyHandler:
我希望每次Watch应用程序通过当前的InterfaceController独立接收消息时都能调用该委托。
我认为实现这一目标的好地方可能是ExtensionDelegate
类:
class ExtensionDelegate: NSObject, WKExtensionDelegate {
let session = WatchSessionManager.sharedManager // THE SINGLETON INSTANCE
func applicationDidFinishLaunching() {
session.startSession()
}
似乎这段代码不起作用,并且从不调用委托函数。
然后我决定采用一种不太通用的方式,我开始在所有InterfaceController中添加对单例实例的引用......但是它再次没有工作,并且从未调用委托方法。 然后,在我的最后一次尝试中,我直接在InterfaceController代码中实现了会话委托协议。在这种情况下,我从iOS应用程序收到消息...它工作正常(显然只有当手表应用程序呈现特定的InterfaceController时)。
我的问题是:为什么实现通用单例对象不起作用?为什么我必须直接在InterfaceController上实现委托才能使它工作?
答案 0 :(得分:1)
尝试将startSession
来自ExtensionController
applicationDidFinishLaunching
的{{1}}方法移至其init
方法。无论正在加载扩展的哪个上下文(复杂化,应用,浏览,通知等),都会调用init
。