Проблемы отладки и восстановления состояния приложения WatchOS WCSession sendMessage для пробуждения убитого iPhone
Я пытаюсь добавить в приложение простую функциональность WatchOS 2.0, чтобы позволить простым действиям запускаться на часах и влиять на мое основное приложение на iPhone. Все это зависит от отправки сообщений с часов, используя метод sendMessage WCSession
[[WCSession defaultSession] sendMessage:applicationData
replyHandler:^(NSDictionary *reply) {
//handle reply from iPhone app here
DbgLog(@"reply received=%@", reply);
}
errorHandler:^(NSError *error) {
//catch any errors here
DbgLog(@"error received=%@", error);
}
];
Пока все работает нормально, сообщение отправлено, сообщение получено, мое приложение реагирует правильно. У меня даже может быть фоновое приложение, и кажется, что все по-прежнему работает нормально (по часам я вижу, отреагировал ли iPhone на сообщения, поскольку iPhone обновит контекст подключения часов, который затем будет отражен на часах). Я просто хочу начать отладку крайних случаев сейчас.
Мои главные два беспокойства...
Как именно я могу отладить систему, разбудив мое приложение, если оно было убито. Я, очевидно, не могу порождать процесс из XCode, если я попытаюсь присоединиться к процессу, очевидно, будет слишком поздно, в идеале я хотел бы иметь возможность установить точки останова очень рано, чтобы увидеть, как все работает. В худшем случае, я полагаюсь на множество журналов и смотрю на них. Просто интересно, есть ли хороший способ отладки этого сценария?
Наконец, что происходит в этом убитом приложении, которое запускается сценарием отправки sendMessage в отношении восстановления состояния. то есть.
- Мое приложение работало с приложением в определенном состоянии (A)
- Я нажимаю кнопку "Домой", чтобы создать фоновое приложение, в это время выполняется кодирование состояния для моего приложения (A).
- Приложение тогда сидит на заднем плане.
- Затем я принудительно убиваю приложение, прекратив запускать его в Xcode.
- Наконец я отправляю сообщение с часов, заставляя систему перезапустить убитое приложение.
- На этом этапе я ожидаю, что произойдет загрузка восстановления состояния, сообщение придет и будет обработано, изменив состояние приложения на состояние B, а затем приложение снова станет фоновым.
Моя проблема заключается в том, что приложение по-прежнему сохраняет свою кодировку состояния, сохраненную в состоянии A, когда оно изначально было фоновым.
Можно ли каким-то образом заставить новое кодирование состояния происходить в фоновом режиме после того, как я закончу обработку подключения часов sendMessage?
Что произойдет, когда я в следующий раз должным образом открою свое приложение, произойдет ли восстановление состояния, которое возвращает нас в состояние A, когда после обработки watch sendMessage оно должно быть в состоянии B. Я предполагаю, что оно все еще работает в фоновом режиме, поэтому все, что происходило, когда приложение порождало приложение в фоновом режиме, должно сохраняться, и никакое новое восстановление состояния не должно происходить. Однако, что если система снова убьет приложение, находясь в фоновом режиме в состоянии B. Понимает ли он, что для этого сценария требуется новое состояние кодирования, чтобы сохранить новое состояние B, или оно просто убивает приложение и ничего не делает. Если так, то когда мы наконец запустим его заново, мы можем снова вернуться в состояние приложения A, а не B.
Кроме того, я только начал пытаться отлаживать подобные вещи, но без возможности, казалось бы, подключить мой отладчик для этой системы, перезапустил экземпляр моего приложения для iPhone. Я заметил, что когда я выполняю sendMessage, который должен разбудить убитое приложение для iPhone, приложение для часов НЕ обновляется должным образом, т.е. приложение телефона не полностью выполняет запрошенное действие. В настоящее время я не знаю, что происходило в этом состоянии, но мне интересно, может быть, восстановление состояния может помешать этому. Получено ли сообщение, пробуждает приложение, пытается воздействовать на данные, которые не существуют, так как восстановление состояния еще не произошло, затем происходит восстановление состояния. Во 2-й раз, когда я отправляю сообщение с часов, приложение работает правильно, поэтому его как будто первоначальное сообщение разбудит приложение, но по какой-то причине неправильно обрабатывает сообщение. Как только проснулся правильно, однако следующее sendMessage обрабатывается как обычно.
К сожалению, я нахожу документацию довольно расплывчатой в отношении того, что происходит, когда приложение для iPhone перезапускается в фоновом режиме после вызова sendMessage. У кого-нибудь есть идеи? Ваше время как всегда действительно ценится! Ура!
1 ответ
Фон и государственная реставрация:
Ваше приложение, которое было запущено в фоновом режиме (затем завершено), никогда не сохранит состояние, потому что оно никогда не переходит от переднего плана к фону (что происходит при сохранении состояния).
Из сохранения и восстановления состояния:
UIKit сохраняет состояние вашего приложения в подходящее время, например, когда ваше приложение перемещается с переднего плана на задний план.
Причина, по которой он не сохраняет состояние, заключается в том, что он запускается прямо в фоновом режиме.
Из жизненного цикла приложения:
Кроме того, приложение, запускаемое непосредственно в фоновом режиме, переходит в [фоновое состояние] вместо неактивного состояния.
Отладка приложения, запущенного в фоновом режиме:
Что касается подключения к вашему приложению, когда оно запускается в фоновом режиме из завершенного состояния, возникает вопрос, который уже обеспечивает правильный подход для этого сценария.
Если у вас есть конкретные вопросы по этому поводу, пожалуйста, оставьте комментарий с автором этого ответа.