我的目标是通过以下步骤更新时钟套件的复杂性:
并发症触发 ExtensionDelegate 向 AppDelegate 发送消息以唤醒父 IOS 应用
然后 iOS 应用程序将下载 / XML 解析数据
AppDelegate 将通过 transferCurrentComplicationUserInfo 将数据传输到 ExtensionDelegate
ExtensionDelegate 传递给复杂控制器
当 iOS 应用程序在前台运行/处于活动状态时,这一切都有效。未启动应用程序时它不起作用。
我需要设置什么设置吗?(已经在 info.plist 中设置了后台下载)请在 Swift 中。
添加了附加信息:
在上述情况下(ComplicationControllor 定期/通过 ExtensionDelegate 计划更新请求),通过 WCSession sendMessage 唤醒 IOS 应用程序不起作用。
当我在 Apple Watch 上启动应用程序(ViewDidLoad 中的接口控制器触发 ExtensionDelegate)以唤醒父应用程序时,我看到了同样的问题。
在这两种情况下,消息都在发送,但如果不在前台,则 IOS 应用程序没有反应。
使用上面“自动”请求场景使用的相同代码,我还实现了一个按钮(为了测试目的而手动触发)。如果在手表上按下按钮,它有时会起作用(ViewController 通过 ExtensionDelegate 中的相同功能向 AppDelegate 发送消息,此人唤醒并回复)。我虽然找不到模式。
由于它使用完全相同的 ExtenstionDelegate 函数,就像在所有情况下发送消息一样,我无法理解为什么只有在手动触发响应时才收到/唤醒父应用程序成功。
这里是来自ExtensionDelegate的代码(由 ComplicationController、InterfaceController-ViewDidLoad 以及提到的按钮调用:
func sendMessage(){
let session = WCSession.defaultSession()
let applicationData = ["wake":"wakeUp"]
session.sendMessage(applicationData, replyHandler: {replyMessage in
}, errorHandler: {(error ) -> Void in
print("no reply message from phone")
})
}
和 AppDelegate:
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
let receivedMessage = message["wake"] as! String
if receivedMessage == "wakeUp" {
let applicationDict = ["wake": "nowAwake"]
replyHandler(applicationDict as [String : String])
}
self.loadData()
}
func loadData(){
... code to load data
dispatch_async(dispatch_get_main_queue()) { () -> Void in
let dictionaryComplication = [...]
if WCSession.isSupported() {
let session = WCSession.defaultSession()
if session.watchAppInstalled {
do {
session.transferCurrentComplicationUserInfo(dictionaryComplication)
try session.updateApplicationContext(dictionaryContext)
} catch {
print("ERROR: \(error)")
}
}
}
}
}