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
中。这将确保可见界面控制器始终是当前委托。
根据我的经验,我注意到为 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
中。这将确保可见界面控制器始终是当前委托。