(Unity 2019.2) iOS сборка падает через 5 секунд после того, как приложение было убито пользователем - PullRequest
0 голосов
/ 26 апреля 2020

Описание

Приложение представляет собой sh 2 ~ 5 секунд после того, как оно было прервано пользователем (т.е. принудительно убило приложение). Это происходит только в iOS сборках на нескольких версиях Unity (подробности см. Ниже). Большинство сообщений о сбоях не приходят на Crashlytics. На консоли очень мало сбоев, хотя мы постоянно воспроизводим эту ошибку ежедневно. Android сборки не отображают ту же ошибку.

Шаги для воспроизведения

  1. Откройте игру
  2. Подождите, пока сцена загрузки подходит к концу sh или до полной загрузки игровой сцены
  3. Убить приложение
  4. Подождите 2 ~ 5 секунд и увидеть окно отчета cra sh

  • Скорость воспроизведения: 80%
  • Устройства, используемые для тестирования: iPhone SE, iPhone 7, iPhone 8, iPad Mini 4
  • Также наблюдал за cra sh on: iPhone XS, iPhone XR

Дополнительная информация

  • Проблема: iOS speci c. У нас такая же сборка на Android, работающая без проблем.
  • Cra sh отчеты не регистрируются Crashlytics в большинстве случаев (см. Некоторые из сбоев ниже).
  • Сбои случаются только на последних этапах загрузки, где инициализируются внешние SDK.
  • На TestFlight счет cra sh равен 0 почти для всех сборок, включая те, о которых пользователи сообщают о сбоях.
  • Использование кнопки отладки, вызывающей метод Application.Quit () Unity, не приводит к тому, что приложение обрабатывает sh, даже если для его закрытия требуется некоторое время.
  • Cra sh кажется неизменным для версии ОС и устройства iOS.

Техническая информация

Исследования

Вот список всех попыток решения безуспешно:

  • Удалить плагин GameAnalytics
  • Удалить плагин IronSource
  • Удалить плагин UnityIAP
  • Обходной путь в PostProcess iOS
  • Установите минимальную версию ОС на 9,0
  • Комментируйте все реализации OnApplicationPause / Quit (включая плагины)
  • Включите битовый код

1 Ответ

0 голосов
/ 27 апреля 2020

Решение

Описание : Общая проблема заключается в том, чтобы при завершении работы приложения любой фрагмент кода блокировал основной поток на iOS (см. этот документ для получения дополнительной информации). В нашем случае это происходит из-за текущих запросов, когда игрок убивает приложение. Поскольку мы сохраняем прогресс проигрывателя на сервере после завершения работы приложения (используя метод Dispose()), запрос блокирует основной поток, вызывая cra sh. Решение состоит в том, чтобы удалить это конкретное сохранение. Мы протестировали сборку, включающую это исправление, и до сих пор у нас не было сбоев при 20 попытках убить игру после загрузки игровой сцены. Мы не думали об этом раньше, потому что этот кусок кода существует с августа 2019 года, и с тех пор его не трогали. Проблема начала возникать только в феврале 2020 года.

Дополнительная информация : поскольку фрагмент кода проблемной c был в проекте с августа 2019 года, и проблема начала возникать только в феврале 2020 года возможно , что версия iOS имеет какое-то отношение к этому. Мы еще не исследовали список изменений, но самая старая версия iOS, представляющая пока что cra sh, - iOS 13.2, выпущенная 28 октября 2019 года.

Другая возможность состоит в том, что некоторые изменения в наш внутренний код вызвал зависание запроса. Поскольку мы используем BestHTTP, по умолчанию все запросы прерываются, когда приложение завершается. Мы не исследовали, может ли быть проблема в порядке выполнения Dispose против OnDisable/OnApplicationQuit. Кроме того, по умолчанию запросы, прерванные BestHTTP во время выхода из приложения, все еще вызывают обратные вызовы. В нашем случае обратным вызовом для этого проигрывателя Save является null, так что это может не быть проблемой.

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

Подсказки : у нас были трудности с получением журналов Crashlytics, потому что большинство из них не было отправлено. Вот пошаговое руководство по извлечению журнала с самого устройства iOS:

  1. Откройте приложение Настройки на устройстве iPhone / iPad
  2. Go до Конфиденциальность (отображается ниже Батарея вкл. iOS 13)
  3. Прокрутите вниз и откройте Аналитика и улучшения
  4. Открыть Данные аналитики
  5. Найти журналы для нужного приложения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...