2

我在使用 WatchOS 时遇到了一个奇怪的问题(但我想这个问题与 iOS 和 OSX 类似)。

我正在使用单例来处理WCSession委托(完整代码由 NatashaTheRobot 提供,我在这里只粘贴了她的一部分代码,完整代码在这里)。此类具有一个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 上实现委托才能使其工作?

4

1 回答 1

1

尝试将startSession调用从ExtensionController'sapplicationDidFinishLaunching移至其init方法。init无论为哪个上下文(复杂性、应用程序、glance、通知等)加载扩展程序,都会调用。

于 2015-11-08T08:13:23.760 回答