Unity 6.3
0 онлайн 85 гостей 3 в системе
Вход
Разработка платформы Шаг 203 из 387

Устранение неполадок на устройствах iOS

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

Примечание: Если проблема сохраняется после устранения неполадок, обратитесь к Сообщить об ошибках для iOS.

Приложение перестает отвечать и Xcode дисплеи прерван в строке состояния

В следующем списке приведены некоторые общие причины возникновения этой проблемы:

  • Ошибки скриптов, такие как использование неинициализированных переменных.
  • Использование сторонних Thumb-компилированных библиотек. Эти библиотеки могут вызвать известную проблему в iOS SDK линкере и могут вызвать случайные сбои.
  • Использование общих типов с типами значений в качестве параметров. Например, List<int>, List<SomeStruct>, List<SomeEnum> для серийных свойств скрипта.
  • Использование отражения при включении управляемого удаления кода.
  • Ошибки в интерфейсе нативных плагинов, когда сигнатура метода в управляемом коде не совпадает с сигнатурой функции в нативном коде.

Информация из консоли отладчика Xcode часто может помочь обнаружить эти проблемы. Доступ к консоли отладчика из Просмотр > Зона отладки > Активация консоли.

Консоль Xcode показывает Программа получила сигнал: “SIGBUS” или EXC_BAD_ACCESS ошибка

Это сообщение обычно отображается на устройствах iOS, когда приложение получает NullReferenceException. Используйте собственные трассировки стека, чтобы узнать, где произошла ошибка.

Трассы стека являются полезным инструментом для расследования ошибок, но их использование требует некоторого опыта. Обычно вы не можете продолжить работу после возникновения таких ошибок доступа к аппаратной памяти. Чтобы получить доступ к трассе стека, введите bt all в консоль отладчика Xcode. Проверьте отпечатанные трассы стека, поскольку они могут содержать информацию о том, где произошла ошибка. Например, типичная трасса стека может выглядеть следующим образом:

...
Thread 1 (thread 11523): 

1. 0 0x006267d0 in m_OptionsMenu_Start ()
1. 1 0x002e4160 in wrapper_runtime_invoke_object_runtime_invoke_void__this___object_intptr_intptr_intptr ()
1. 2 0x00a1dd64 in mono_jit_runtime_invoke (method=0x18b63bc, obj=0x5d10cb0, params=0x0, exc=0x2fffdd34) at /Users/mantasp/work/unity/unity-mono/External/Mono/mono/mono/mini/mini.c:4487
1. 3 0x0088481c in MonoBehaviour::InvokeMethodOrCoroutineChecked ()
...

Найдите трассировку стека для &quot; Поток 1 &quot;Начальные строки стека будут указывать на то место, где произошла ошибка. В этом примере след указывает, что ошибка произошла в процессе, который NullReferenceException произошло внутри _OptionsMenu_ сценарии _Start_ метод. Проверка реализации этого метода может помочь выявить причину проблемы. Как правило, NullReferenceExceptions произойти внутри _Start_ метод, когда неправильные предположения сделаны о порядке инициализации.

Иногда в консоли отладчика отображается только частичная трасса стека. Например:

Thread 1 (thread 11523): 

1. 0 0x0062564c in start ()

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

  1. Удалите приложение с устройства.
  2. Очистить все цели.
  3. Выберите Продукт > Запуск.
  4. Получите трассировки стеков, как описано выше.

Консоль Xcode показывает WARNING -> applicationDidReceiveMemoryWarning() и затем приложение падает

Вы можете столкнуться с предупреждением, как Program received signal: "0". Это предупреждение часто не является смертельным, и указывает на то, что iOS не хватает памяти. Обычно, фоновые процессы, такие как Mail высвободят некоторую память, и ваше приложение может продолжать работать. Однако, если ваше приложение продолжает использовать память или просит больше, iOS начнет прекращать приложения, включая ваше собственное. Apple не документирует, какое использование памяти безопасно, но наблюдения показали, что приложения, использующие менее 50% всех устройств RAM не имеют серьезных проблем с использованием памяти.

Основным показателем, который следует использовать, является количество RAM, используемое вашим приложением. Использование памяти приложения состоит из следующих компонентов:

Компонент Описание
Код приложения OS должен загружать и хранить код приложения в RAM, но некоторые из них могут быть отброшены, если это необходимо.
Родной куча Используется движком для хранения состояния и ваших ассетов в оперативной памяти.
Управляемая куча Используется временем выполнения il2cpp для хранения объектов C#.
Metal пулы памяти Используется для хранения текстур, кадровых буферов и скомпилированных шейдеров.

Вы можете отслеживать использование памяти приложения в Xcode. Дополнительные сведения см. в Сбор информации об использовании памяти (разработчик Apple).

Чтобы сохранить использование памяти на низком уровне, используйте следующие предложения:

  • Уменьшение размера двоичного файла приложения: Используйте наиболее сильный iOS и избежать ненужной зависимости от различных .NET библиотеки. Дополнительные сведения см. в Игрок настройки и Оптимизация размера построенного iOS Игрок.
  • Уменьшите размер вашего контента: Используйте сжатие ASTC или ETC для текстур и используйте модели низкого поли. Для более подробной информации, см. уменьшение размера файла.
  • Не выделяйте больше памяти, чем необходимо в своих скриптах: Отслеживайте размер моно стека и использование с Profiler окна.

Запрос OS о количестве свободной памяти может показаться наиболее эффективным способом оценки того, насколько хорошо работает ваше приложение. Однако, статистика свободной памяти может оказаться ненадежной, так как OS использует много динамических буферов и кэшей. Рекомендуется отслеживать потребление памяти для вашего приложения и использовать это в качестве главной метрики, в сочетании с инструментами памяти Xcode, особенно после загрузки новых сцен.

Приложение запускается правильно из Xcode, но сбивает загрузку первой сцены на устройстве

Рекомендуется проверить журналы устройства, чтобы получить более подробную информацию. Для этого выполните следующие действия:

  1. Подключите целевой устройства к вашему macOS устройства.
  2. Из Xcode, выберите Окно > Устройства и симуляторы.
  3. Выберите свое устройство в левой панели инструментов окна.
  4. Нажмите Показать консоль устройства и просмотрите последние сообщения.

Дополнительные сведения см. в Получение отчетов о сбоях и диагностических журналов (разработчик Apple).

Убитый SpringBoard появляется в консоли Xcode Organizer

Существует установленный временной лимит, позволяющий приложению iOS рендировать первые кадры и обработать ввод. Если ваше приложение превышает этот лимит, оно прекращается SpringBoard. Например, это может произойти в приложении, где размер первой сцены слишком велик. Рекомендуется создать небольшую начальную сцену с экраном запуска, подождать несколько кадров, а затем перейти к загрузке более большой сцены. Для достижения этого используйте следующий пример:

IEnumerator Start() {
    yield return new WaitForEndOfFrame();
// Do not forget using UnityEngine.SceneManagement directive
    SceneManager.LoadScene("Test");
}

Сбои происходят на устройстве при использовании System.Security.Cryptography и управляемого удаления кода

. Криптографические службы .NET несовместимы с усечением управляемого кода. Они опираются на рефлексию, тогда как усечение управляемого кода основано на статическом анализе. Процесс усечения можно настроить, добавив собственный link.xml файл к Assets папка вашего проекта Unity. Это указывает типы и пространства имен, которые будут исключены из стрипинга. System.Security.Crypography пространства имен от процесса удаления, чтобы помочь решить эту проблему. Например, добавьте следующее в link.xml файл:

<linker>
       <assembly fullname="mscorlib">
               <namespace fullname="System.Security.Cryptography" preserve="all"/>
       </assembly>
</linker>

При использовании System.Security.Cryptography.MD5 и управляемого удаления кода приложение срывается

Вы можете решить эту проблему так же, как это описано в предыдущем разделе, или добавить дополнительные ссылки на конкретные классы в код скрипта. Для этого используйте следующий пример:

object obj = new MD5CryptoServiceProvider();

PlayerLoop вызывается рекурсивно! сообщение об ошибке возникает при использовании Cocoa через собственную функцию

Некоторые операции в UI приводят к немедленной перерисовке окна в iOS. Наиболее распространённый пример — добавление UIView с UIViewController в основное UIWindow. Если вызвать нативную функцию из скрипта, вызов произойдёт внутри PlayerLoop Unity, что приведёт к рекурсивному вызову PlayerLoop. В этом случае появится сообщение об ошибке PlayerLoop called recursively!. Рекомендуется использовать метод performSelectorOnMainThread (Apple Developer), задав для waitUntilDone значение false. Тогда iOS запланирует выполнение операции между вызовами PlayerLoop Unity.

Profiler или отладчик не могут получить доступ к приложению

Чтобы диагностировать эту проблему, воспользуйтесь следующими предложениями:

  • Убедитесь, что вы построили сборку Разработка Build, включили Script Debugging и Autoconnect Profiler. Дополнительные сведения об этих свойствах см. в iOS ссылка на настройки сборки.
  • Приложение, запущенное на устройстве, сделает мультикаст-трансляцию на 225.0.0.222 на UDP порте 54997. Проверьте, что ваши сетевые настройки разрешают этот трафик. Профиль также установит соединение с удаленным устройством на порте в диапазоне 55000 - 55511 для получения данных профиля с устройства. Эти порты должны быть открыты для доступа TCP.

Xcode отображает ошибку ARM64 ветка вне диапазона (<значение> макс. +/–128МБ)

Эта проблема возникает, когда созданный машинный код слишком большой и достиг ограничений Xcode. Это может произойти, если у вас много скриптового кода или используются большие внешние сборки .NET в сборке. Использование параметра сборки Script Debugging также может привести к этой проблеме, так как оно создает дополнительные инструкции для каждой функции.

Чтобы помочь решить эту проблему, в Unity Editor перейдите в Изменить > Project Настройки > Проигрыватель > iOS и попробуйте один или несколько из следующих вариантов:

  • Включить Код двигателя.
  • Используйте более высокий Управляемый Уровень Стриптинга.
  • Установить IL2CPP Генерирование кода до Оптимизация для размера кода и времени сборки.

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

iOS симуляторы не видны на ARM основанных Mac, работающих Xcode 14.3

Начиная с версии Xcode 14.3, Apple ввела опцию Destination Architecture. С Destination Architectureвы можете использовать симуляторы iOS на Mac, основанных на ARM, без необходимости запуска Xcode в режиме симулятора Rosetta.

Чтобы просмотреть симуляторы iOS, выполните следующие действия:

  1. В меню Xcode выберите Продукт > Назначение > Архитектуры назначения.
  2. Выбрать Показать Rosetta Направления, или Показать оба для просмотра iOS симуляторы для Apple Silicon и Rosetta.

Дополнительные ресурсы