如何使用complicationController的sendMessage唤醒iOS父应用程序

我试图通过从watchkit扩展发送消息来唤醒iOS父应用程序。

这虽然只有在从watchApp / ViewController调用下面的sendMessage函数时才起作用。 从ComplicationController调用时,会发送消息,但iOS父应用程序现在会唤醒。

任何意见赞赏。 (请在Swift中的任何代码参考)

这里的简化代码:

在AppDelegate和ExtensionDelegate中:

override init() { super.init() setupWatchConnectivity() } private func setupWatchConnectivity() { if WCSession.isSupported() { let session = WCSession.defaultSession() session.delegate = self session.activateSession() } } 

在ExtensionDelegate :(这里没有问题,消息成功发送)

 func sendMessage(){ let session = WCSession.defaultSession() let applicationData:[String:AnyObject] = ["text":"test", "badgeValue": 100 ] session.sendMessage(applicationData, replyHandler: {replyMessage in print("reply received from iphone") }, errorHandler: {(error ) -> Void in // catch any errors here print("no reply message from phone") }) } print("watch sent message") } 

在AppDelegate:(没有收到iOS应用程序不运行/不在前台)

 func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { let text = message["text"] as! String let badgeValue = message["badgeValue"] as! Int dispatch_async(dispatch_get_main_queue()) { () -> Void in print("iphone received message from watch App") self.sendNotification(text, badgeValue: badgeValue) let applicationDict = ["wake": "nowAwake"] replyHandler(applicationDict as [String : String]) } } 

这是如何从复杂控制器(它发送消息,但没有唤醒父应用程序)调用函数:

  func requestedUpdateDidBegin(){ dispatch_async(dispatch_get_main_queue()) { () -> Void in let extensionDelegate = ExtensionDelegate() extensionDelegate.loadData() } } 

主要的问题是你试图在你的并发数据源中包含(嵌套的) asynchronous调用 。 但是,您所请求的更新将会到达其方法的末尾,并且实际上不会进行时间线更新(因为您没有重新加载或延长时间线 ,并且即使您有更新,也不会及时收到新的数据当前更新)。

由于没有新的数据可用于计划的更新,所以您必须执行第二次更新才能在收到新数据使用这些数据。 执行两个紧接着的更新不仅是不必要的,而且会浪费更多的日常复杂性预算。

Applebuild议您在更新之前提取并caching数据 ,以便复杂数据源可以直接将请求的数据返回到并发服务器。

数据源类的工作是尽可能快地为ClockKit提供所需的数据。 数据源方法的实现应该是最小的。 不要使用数据源方法从networking获取数据,计算值或做任何可能延迟数据传递的事情。 如果您需要为复杂function获取或计算数据,请在您的iOS应用程序或WatchKit扩展的其他部分执行此操作,并将数据caching到复杂数据源可以访问的位置。 数据源方法应该做的唯一事情就是获取caching的数据,并将其放入ClockKit所需的格式。

如何更新并发症?

  • 使用手机中的后台更新传输数据,以便下次更新计划。 transferUserInfoupdateApplicationContext适合这种types的更新。

  • 使用transferCurrentComplicationUserInfo可立即传输并发症数据并更新您的时间表 。

这两种方法都具有只需要进行一次更新的优点。