WatchConnectivity - 检测所有控制器中的应用程序上下文更改

WatchConnectivity - detect Application Context change in all controllers

我正在尝试从 iOS -> Watch 发送数据,当活动控制器已实施 didReceiveApplicationContext 时,这工作正常。我可以接收上下文对象并且一切正常。

但是,我不清楚如何实现 didReceiveApplicationContext "globally",以便 Watch 捕获来自 iOS 的上下文数据更改,而不管用户使用的是哪个控制器。我有几个用户可以在其中导航的控制器,因此当它们位于没有此委托方法的控制器上时,不会捕获任何数据。

我尝试将此委托方法添加到 ExtensionDelegate.m 以尝试全局捕获来自 iOS 的数据,但当我尝试输出到日志时它似乎没有捕获任何内容.

我假设有一种方法可以实现这一点,而无需在每个 Watch 控制器中实现 didReceiveApplicationContext

谢谢

您可以创建一个委托 class 来侦听新数据,然后将新数据通知所有感兴趣的接口控制器。如果你有多个接口控制器需要在新数据到达时更新,你可以将这个委托实现为单例,以便能够从你的扩展的任何部分添加观察者(就像 Apple 对其 NSNotificationCenter class 所做的那样):

class SessionDelegate {
    static let sharedDelegate = SessionDelegate()
    private override init() {}
    ....
}

定义所有感兴趣的接口控制器都可以实现的观察者协议:

protocol DataObserver {
    func dataDidChange(data: AnyObject)
}

向您的委托添加一个观察者数组 class 以及添加和删除观察者的两种方法:

private var observers = [DataObserver]()

func addObserver(observer: DataObserver) {
   // add the observer to observers
}

func removeObserver(observer: DataObserver) {
   // remove the observer from observers
}

当您收到新数据时,遍历观察者并调用协议中定义的方法:

func didReceiveData(data: AnyObject) {
    for observer in observers {
        observer.dataDidChange(data)
    }
}

现在所有需要刷新的WKInterfaceController class都可以将自己添加为观察者:

SessionDelegate.sharedDelegate.addObserver(self)

并实现协议中的方法:

func dataDidChange(data: AnyObject) {
    // update UI
}

最后,您必须通知您的委托 class 新数据已到达,以便它可以通知其观察者。因此,在您的 ExtensionDelegate 中实施 didReceiveApplicationContext 并在您的代表 class:

上调用 dataDidChange
extension ExtensionDelegate: WCSessionDelegate {
    func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
        SessionDelegate.sharedDelegate.dataDidChange(applicationContext)
    }
}