使用单例WCSession委托而不是实例方法

时间:2015-11-06 17:18:55

标签: watchkit watch-os-2 watchconnectivity

我遇到了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上实现委托才能使它工作?

1 个答案:

答案 0 :(得分:1)

尝试将startSession来自ExtensionController applicationDidFinishLaunching的{​​{1}}方法移至其init方法。无论正在加载扩展的哪个上下文(复杂化,应用,浏览,通知等),都会调用init