Моя цель - обновить усложнение комплекта часов, выполнив следующие шаги:
усложнение вызывает ExtensionDelegate для sendMessage в AppDelegate, чтобы разбудить родительское приложение IOS
Приложение iOS загрузит / данные синтаксического анализа XML.
AppDelegate будет передавать данные через transferCurrentComplicationUserInfo в ExtensionDelegate
ExtensionDelegate переходит к контроллеру осложнений
Все это работает, когда приложение iOS работает / активно на переднем плане. Не работает, когда приложение не запущено.
Есть ли какие-то настройки, которые мне нужно установить? (уже настроены в info.plist для фоновой загрузки) Пожалуйста, используйте Swift.
Добавлена дополнительная информация:
В приведенном выше сценарии (регулярный / запланированный запрос обновления ComplicationControllor через ExtensionDelegate) пробуждение приложения IOS через WCSession sendMessage не работает.
Я вижу ту же проблему, когда запускаю приложение на часах Apple (триггеры InterfaceController в 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)")
}
}
}
}
}