Запуск игры на macOS: подпись и диагностика
Первый запуск, проверка пакета и разбор ошибок без отключения защиты системы.
Руководство описывает запуск экспортированной игры Reckfell на macOS и помогает отличить блокировку системы от ошибки приложения. Сначала создайте экспорт: см. Экспорт для macOS.
Первый запуск
Распакуйте ZIP перед запуском .app либо скопируйте приложение со смонтированного образа в выбранный каталог установки. Сохраняйте комплектность пакета приложения и сопутствующих файлов. Перемещение в «Программы» не исправляет подпись и не выполняет нотариализацию.
Для распространения вне Mac App Store подпись, нотариализация и разрешение запуска — разные этапы. Подпись ad-hoc не подтверждает личность через Developer ID. Работа локальной сборки на компьютере разработчика не доказывает, что скачанный релиз пройдёт Gatekeeper на другом Mac. Для App Store действуют проверки при отправке приложения, а не отдельный ручной процесс нотариализации. См. требования Apple к нотариализации.
Если macOS блокирует доверенную тестовую сборку из-за неизвестного разработчика или отсутствия нотариализации, сначала попробуйте открыть её. Затем используйте Системные настройки → Конфиденциальность и безопасность → Всё равно открыть, если этот пункт доступен, и подтвердите конкретное приложение. Названия и доступность зависят от macOS и политики управления устройством. Это исключение для приложения, а не исправление распространяемого пакета. Следуйте актуальным инструкциям Apple.
Сообщение о вредоносном коде, отозванном разрешении или повреждённом/изменённом приложении требует отдельного разбора. Получите свежий пакет из доверенного источника и передайте разработчику точный текст сообщения. Новая подпись или снятие карантина не подтверждают корректность повреждённой загрузки. Для этого процесса не требуется отключать защиту всей системы.
Проверка проблемного пакета
Выполните команды на целевом Mac. В первой строке укажите настоящий абсолютный путь к .app. Имя исполняемого файла берётся из CFBundleExecutable: оно не обязано совпадать с отображаемым названием игры.
APP="/absolute/path/My Game.app"
EXECUTABLE=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleExecutable' "$APP/Contents/Info.plist")
file "$APP/Contents/MacOS/$EXECUTABLE"
codesign --display --verbose=4 "$APP"
codesign --verify --deep --strict --verbose=2 "$APP"
spctl --assess --type execute --verbose=4 "$APP"
xattr -l "$APP"Команды читают метаданные, архитектуру, подписи и локальную политику запуска: не переподписывают приложение, не меняют правила Gatekeeper и не снимают карантин. Если чтение CFBundleExecutable завершилось ошибкой, сначала исправьте путь или состав пакета, затем проверяйте исполняемый файл.
fileпоказывает доступные архитектуры. Mac arm64, Intel Mac и universal-сборка — разные цели; нативные библиотеки тоже должны поддерживать архитектуру запуска.codesign --displayпоказывает данные подписи.codesign --verifyпроверяет целостность подписанного кода: учитывайте диагностику и код завершения. Корректная ad-hoc-подпись не является Developer ID и не доказывает нотариализацию.spctl --assessпроверяет действующую политику этого компьютера. Результат зависит в том числе от управления устройством и локальных настроек. Он не заменяет проверку поставляемого архива на чистой машине.xattr -lперечисляет атрибуты. Само наличие или отсутствиеcom.apple.quarantineне подтверждает целостность, безопасность или успешную нотариализацию.
Apple отдельно описывает проверку подписи и оценку системной политики. Сохраните полные результаты вместе с хешем проверенного архива, версией macOS и архитектурой CPU.
Игра запускается и сразу завершается
Убедившись, что это нужная сборка, запустите исполняемый файл из Terminal, чтобы увидеть диагностику старта:
"$APP/Contents/MacOS/$EXECUTABLE" --verboseИспользуйте значения APP и EXECUTABLE из предыдущего примера. Команда запускает игру. Окружение и рабочий каталог Terminal могут отличаться от Finder; успешный запуск здесь не заменяет обычный запуск из Finder.
Проверяйте последнюю ошибку, не приписывая любое завершение Gatekeeper. При аварии сохраните соответствующий отчёт macOS и символы именно этой сборки; см. Нативная отладка на macOS.
Для упакованных ресурсов используйте asset://, для сохранений с правом записи — user://. Текущий каталог процесса не является каталогом проекта или стабильным местом рядом с .app. macOS может запускать приложение в карантине из перемещённого системного пути. Перенос пакета не заменяет исправление относительных путей; не записывайте создаваемые данные внутрь подписанного пакета приложения.
Что гарантирует экспортёр
По текущим исходникам экспорт на хосте macOS по умолчанию выбирает Xcode codesign, на других хостах — встроенную ad-hoc-подпись. Начальное значение identity для Xcode пустое: экспортёр трактует его как ad-hoc. Нотариализация по умолчанию отключена. Эти настройки не создают релиз с Developer ID.
Функция подписи сообщает об ошибках внешнего инструмента предупреждениями и не возвращает вызывающему коду статус подписи. Поэтому успешного экспорта недостаточно для подтверждения корректной подписи: проверьте журнал и итоговый пакет.
Ветка notarytool сообщает UUID запроса после отправки. Это не подтверждение принятой нотариализации. Проверьте итоговый статус и журнал по процессу Apple, затем подготовьте билет и конечный архив для распространения. Изменение содержимого после подписи может её нарушить. См. процесс нотариализации Apple.
При экспорте C# сохраняйте managed-файлы, нативные зависимости нужной архитектуры и необходимые entitlements. Когда экспортёр сам создаёт entitlements, сборка с CSharpScript включает разрешения для JIT; свой файл entitlements требует отдельной проверки. Параметр codesign/entitlements/debugging по умолчанию false: его включение добавляет com.apple.security.get-task-allow в создаваемый файл. Разделяйте локальную отладку и подпись релиза.
Диагностика по симптомам
| Симптом | Следующая проверка |
|---|---|
| Неизвестный разработчик / нет нотариализации | Реальная identity, итог нотариализации, точное сообщение и локальная политика; для своей доверенной тестовой сборки — процедура исключения выше. |
| Подпись не проходит проверку | Свежий исходный архив, изменённые или пропавшие файлы, подписи вложенных исполняемых файлов и библиотек. |
| Несовместимая архитектура / не загружается библиотека | Архитектуры исполняемого файла и нативных зависимостей: другая загрузка не исправит неподходящую библиотеку внутри пакета. |
| В Finder не работает, в Terminal работает | Окружение, относительные пути и права; сохраните результаты обоих запусков. |
| Не найдены ресурсы или сохранения | Состав упакованных ресурсов и использование asset:// / user://, а не рабочего каталога shell. |
| Managed-игра завершается на старте | Managed-файлы, runtime и нативные зависимости, итоговые entitlements и журнал запуска. |
| Запрос нотариализации отправлен, релиз блокируется | Итоговый статус и журнал Apple, конечный поставляемый файл; одного UUID недостаточно. |
Для руководства по исходникам проверены настройки экспортёра, обработка подписи и отправки на нотариализацию, создаваемые entitlements и преобразование путей. Также изучена документация Apple. На хосте проверки Windows не выполнялись действия интерфейса macOS, подпись, нотариализация, изменение карантина, экспорт приложения или запуск на устройстве.