пробуждение родительского приложения IOS через sendMessage не работает

Моя цель - обновить усложнение комплекта часов, выполнив следующие шаги:

  1. усложнение вызывает ExtensionDelegate для sendMessage в AppDelegate, чтобы разбудить родительское приложение IOS

  2. Приложение iOS загрузит / данные синтаксического анализа XML.

  3. AppDelegate будет передавать данные через transferCurrentComplicationUserInfo в ExtensionDelegate

  4. 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)")
                }
            }

        }
    }
}

person TPeter    schedule 24.10.2015    source источник


Ответы (1)


Убедитесь, что вы активировали WCSession в init методе ExtensionDelegate, а не в applicationDidFinishLaunching:

class ExtensionDelegate: NSObject, WKExtensionDelegate {

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

applicationDidFinishLaunching вызывается только тогда, когда пользователь запускает WatchApp, но не когда Complication запрашивает новые данные.

person joern    schedule 24.10.2015
comment
Спасибо за ваш ответ. Я уже запускаю WCSession в функции инициализации (как в AppDelegate, так и в ExtensionDelegate). К сожалению, это не пробуждает родительское приложение IOS, когда вызов возникает из-за осложнения (добавит больше деталей к вопросу). Благодарю за ваш ответ !! - person TPeter; 25.10.2015
comment
Не могли бы вы добавить к своему ответу соответствующие части кода? В противном случае найти проблему довольно сложно. - person joern; 25.10.2015