在我的一些经验中,我注意到为WatchKit应用程序创建两个或多个接口控制器(IC)时,AppleWatch会在用户滑动到它之前开始加载下一个界面。这可能对系统性能很有用,但也有一些东西让我感到困惑。我所理解的是,每个IC都应该有自己的WCSession来与配对的iPhone通信,但我开始认为这不是真的,因为调试时我看到,如果第一个IC使用sendMessage发送请求,那么第二个IC的didReceiveMessage就会收到答案,而不是第一个IC。我还没有试过,但也许我应该只在第一个IC中创建WCSession,如果我在另一个IC上,应用程序会在第一个IC的didReceiveMessage中启动它。如果这是正确的,当信息到达时,我如何在第二个IC中做些什么?在WatchKit中,我认为我不能使用观察者。有人能给我澄清一下吗?
在互联网上做更多的搜索,我发现:http://www.sneakycrab.com/blog/2015/5/26/wkinterfacecontroller-lifecycle-in-watchos-101 --这是关于IC预加载的确认,在WatchOS 2中也是一样。
发布于 2015-10-29 08:41:09
现在,使用全局公共变量,我能够触发正确的会话。
----- 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()
}
}由于上述文章中解释的系统预加载,我应该“教”mySecondIC不要在第一次页面被激活时创建会话,因为它是不可见的。
发布于 2016-03-30 06:32:43
您使用的是WCSession.defaultSession,这很好,正如苹果所建议的那样,但这意味着session指向两个WKInterfaceControllers中的同一个对象,因此session.delegate = self通过设计将会话的委托设置为最近加载(未显示)的WKInterfaceController。正如您所发现的,WKInterfaceControllers经常在它们被特别需要之前加载--这是苹果的显式文件。
解决这一问题的正确方法是在每个WKInterfaceController的didAppear方法中而不是在willActivate中设置会话委托。这将确保可见接口控制器始终是当前委托。
发布于 2015-11-21 11:09:23
使用transferCurrentComplicationUserInfo发送数据并在watchkit中使用-(WCSession)会话:(WCSession*)会话didReceiveUserInfo:(NSDictionary *)userInfo接收数据
方法。
https://stackoverflow.com/questions/33365775
复制相似问题