Watchkit 和 WCSession

Watchkit and WCSession

根据我的经验,我注意到为 WatchKit 应用程序创建两个或多个界面控制器 (IC),AppleWatch 在用户滑动到它之前开始加载下一个界面。这可能对系统性能很有用,但后来有些事情让我感到困惑。 据我了解,每个 IC 都应该有自己的 WCSession 来与配对的 iPhone 进行通信,但我开始认为这不是真的,因为调试时我看到如果例如第一个 IC 使用 sendMessage 发送请求,答案是由第二个 IC 而不是第一个 IC 的 didReceiveMessage 接收的。 我还没有尝试过,但也许我应该只在第一个 IC 中创建 WCSession,而且如果我在另一个 IC 上,应用程序会在第一个的 didReceiveMessage 中触发它。如果这是正确的,当消息到达时,我如何在第二个 IC 中做些什么?在 WatchKit 中,我认为我不能使用 Observers。 有人可以向我解释一下吗?

通过互联网进行更多搜索,我发现了这个:http://www.sneakycrab.com/blog/2015/5/26/wkinterfacecontroller-lifecycle-in-watchos-101 这是关于IC预加载的确认,在WatchOS 2中也是如此。

现在我可以使用全局 public 变量来触发正确的会话。

----- myVariables.swift -----
public var showPage1: Bool = false

----- myMainIC.swift -----
override func willActivate() {
    super.willActivate()
    showPage1 = false
}

----- mySecondIC.swift -----
var session: WCSession?
override func WillActivate() {
    super.willActivate()
    // this way I can manage the pre-load
    if (showPage1 == false) {
        showPage1 = true
        return
    }
    // now I can create the session
    if WCSession.isSupported() {
        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
}

由于上面文章中解释的系统预加载,我应该 "teach" mySecondIC 不会在页面第一次激活时创建会话,因为它是不可见的。

使用 transferCurrentComplicationUserInfo 发送数据 并使用 watchkit 接收数据 - (void)session:(WCSession *)session didReceiveUserInfo:(NSDictionary *)userInfo

方法。

您正在使用 WCSession.defaultSession,这很好,正如 Apple 推荐的那样,但这意味着 session 在两个 WKInterfaceControllers 中指向同一个对象,所以 session.delegate = self 通过设计将会话的委托设置为最近加载(未显示)的 WKInterfaceController。正如您所发现的,WKInterfaceControllers 通常在它们被特别要求之前加载——Apple explicitly documents.

解决这个问题的正确方法是在每个 WKInterfaceController 的 didAppear 方法中设置会话委托,而不是在 willActivate 中。这将确保可见界面控制器始终是当前委托。