Сохранение сцены NSUserActivity вручную на iOS/iPadOS 13

Я реализовал восстановление состояния iOS/iPadOS 13, используя NSUserActivity, главным образом потому, что мое приложение поддерживает несколько сцен.

Проблема в том, что когда я запускаю симулятор с двумя параллельными сценами и принудительно перезапускаю приложение путем перестроения, действия не сохраняются, а пользовательский интерфейс не восстанавливается должным образом при перезапуске.

С другой стороны, если я сначала вернусь на главный экран iPad, а затем принудительно перезапущу приложение, действия будут правильно восстановлены.

Означает ли это, что сбой моего приложения помешает сохранению этих действий, что приведет к несогласованному состоянию пользовательского интерфейса при перезапуске?

А как можно было периодически "форсировать" действия по сохранению (получить stateRestorationActivity(for scene:) называется)?

1 ответ

Решение

Проблема в том, что когда я запускаю симулятор с двумя параллельными сценами и принудительно перезапускаю приложение путем восстановления, действия не сохраняются, а пользовательский интерфейс не восстанавливается должным образом при перезапуске.

Когда вы "принудительно перезапускаете приложение путем перестройки", вы видите ожидаемое поведение. Когда вы принудительно перезапускаете таким образом, у приложения не будет возможности сохранить ваши NSUserActivities. Согласно руководству Apple по восстановлению состояния:

Если вы хотите проверить способность вашего приложения восстанавливать свое состояние, не используйте переключатель приложений, чтобы убить приложение во время отладки. Вместо этого используйте Xcode, чтобы убить приложение, или убейте приложение программным способом. Один из способов - приостановить приложение с помощью кнопки "Домой", а затем остановить отладчик в Xcode. Когда вы снова запускаете приложение с помощью Xcode, UIKit инициирует процесс восстановления состояния.

Я понимаю, что вы не убивали приложение в переключателе, но любая "принудительная" остановка отключит восстановление состояния (с оговоркой). Чтобы протестировать восстановление состояния, вместо этого используйте метод, предложенный в руководстве Apple выше.

Означает ли это, что сбой моего приложения помешает сохранению этих действий, что приведет к несогласованному состоянию пользовательского интерфейса при перезапуске?

Я думаю так. Это предостережение, сделанное ранее. Хотя Apple заявляет, что завершение работы приложения (будь то в переключателе приложений или из-за сбоя или чего-то еще) отключит восстановление состояния, это не обязательно так. Вы можете сами убедиться, что собственные приложения Apple имеют странные несоответствия восстановления состояния, когда их убивают в переключателе приложений и повторно открывают (возможно, вам придется попробовать это несколько раз, чтобы получить противоречивое поведение). Хотя я не тестировал это, я предполагаю, что такие же несоответствия могут возникать из-за сбоев приложений.

Другие вопросы по тегам