我的目标是通过以下步骤更新时钟套件并发症:
复杂化触发ExtensionDelegate将sendMessage发送到AppDelegate以唤醒父IOS应用程序
iOS应用程序将下载/ XML解析数据
AppDelegate将通过transferCurrentComplicationUserInfo传输数据到ExtensionDelegate
ExtensionDelegate传递给Complication Controller
当iOS应用程序在前台运行/活动时,这一切都有效。当应用程序未启动时,它不起作用。
我需要设置任何设置吗? (已在info.plist中设置后台下载)请在Swift中。
添加了其他信息:
在上面的场景中(通过ExtensionDelegate进行ComplicationControllor常规/预定更新请求),通过WCSession sendMessage唤醒IOS应用程序不起作用。
当我在apple watch上启动应用程序(InterfaceController在ViewDidLoad ExtensionDelegate中触发)以唤醒父应用程序时,我看到同样的问题。
在这两种情况下都会发送消息,但如果不在前台,则不会对IOS应用程序做出反应。
使用上述“自动”请求方案使用的完全相同的代码,我还实现了一个按钮(手动触发以进行测试)。如果在手表上按下按钮,它有时会起作用(ViewDetroller通过ExtensionDelegate中的相同功能向AppDelegate发送消息,此消息唤醒并回复)。我虽然无法找到模式。
由于它使用完全相同的ExtenstionDelegate函数,就像在所有场景中都要发送消息一样,我无法理解为什么只有在手动触发响应时才接收/唤醒父app成功。
来自 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)")
}
}
}
}
}
答案 0 :(得分:0)
确保在ExtensionDelegate的init
方法中激活WCSession,而不是在applicationDidFinishLaunching
中激活:
class ExtensionDelegate: NSObject, WKExtensionDelegate {
override init() {
super.init()
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
}
...
}
applicationDidFinishLaunching
仅在用户启动WatchApp时调用,而不是在复杂请求新数据时调用。