[英]how to wake up iOS parent app with sendMessage from complicationController
我正在尝试通过从 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()
}
}
主要问题是您试图在复杂数据源中包含(嵌套)异步调用。 但是,您请求的更新将已到达其方法的末尾,并且实际上不会发生时间线更新(因为您没有重新加载或扩展时间线,即使您有,也不会及时收到新数据)当前更新)。
由于没有新数据可用于计划的更新,因此您必须在收到新数据后执行第二次更新才能使用新数据。 执行两次背靠背更新不仅没有必要,还会浪费更多的日常复杂功能预算。
Apple 建议您在更新之前先获取并缓存数据,以便复杂数据源可以直接将请求的数据返回给复杂服务器。
数据源类的工作是尽快为 ClockKit 提供任何请求的数据。 数据源方法的实现应该是最少的。 不要使用您的数据源方法从网络获取数据、计算值或执行任何可能延迟该数据交付的操作。 如果您需要为您的复杂功能获取或计算数据,请在您的 iOS 应用程序或 WatchKit 扩展的其他部分执行此操作,并将数据缓存在您的复杂功能数据源可以访问它的位置。 您的数据源方法唯一应该做的就是获取缓存的数据并将其放入 ClockKit 所需的格式。
你如何更新并发症?
使用手机的后台更新来传输数据,以便复杂功能的下一次预定更新。 transferUserInfo
和updateApplicationContext
适合这种类型的更新。
使用transferCurrentComplicationUserInfo
立即传输复杂数据并更新您的时间线。
这两种方法的优点是只需要进行一次更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.