Какие процессы вызываются при запуске iOS приложения
Что проверяют
Понимаете ли вы, что происходит до main(), а не только помните имя метода делегата. Вопрос ведёт к оптимизации холодного старта: следом спросят, где уходит время и чем вы это измеряли.
Как отвечать
Разделите запуск на две части.
- до
main: система создаёт процесс,dyldзагружает исполняемый файл и динамические библиотеки, применяет rebase и binding указателей, поднимается рантайм Objective-C: регистрируются классы, выполняются+loadи статические конструкторы; mainи UIKit:UIApplicationMainсоздаёт единственный экземплярUIApplication, поднимает делегат, читаетInfo.plistи запускает главный run loop;- делегат:
application(_:willFinishLaunchingWithOptions:), затемapplication(_:didFinishLaunchingWithOptions:); - сцены: с iOS 13 окно создаёт
UISceneDelegate, а не делегат приложения: система запрашивает конфигурацию вapplication(_:configurationForConnecting:options:)и вызываетscene(_:willConnectTo:options:), где вы ставитеrootViewController, дальшеsceneWillEnterForegroundиsceneDidBecomeActive; - первый кадр:
viewDidLoad,viewWillAppear, лейаут, и запуск завершён только после отрисовки первого кадра. В SwiftUI ту же роль играет структура с@mainиWindowGroup.
Дальше цифры и инструменты: watchdog убивает приложение, если запуск затянулся (порядка двадцати секунд), а целью до первого кадра ставят около 400 мс. Меряют шаблоном App Launch в Instruments, DYLD_PRINT_STATISTICS и MetricKit с MXAppLaunchMetric. Помните про prewarming: часть работы система делает заранее, и замеры прыгают.
Где спотыкаются
Начинают сразу с didFinishLaunchingWithOptions и не могут сказать, что было до него. А лишняя секунда чаще всего именно там: десятки динамических фреймворков и тяжёлые +load.
Складывают в didFinishLaunching всё подряд: миграцию базы, инициализацию всех SDK, сетевой запрос. Главный поток занят, первый кадр отодвигается, пользователь смотрит на заставку.
Путают сценовый жизненный цикл со старым и рассказывают про applicationDidEnterBackground, когда в проекте объявлен UIApplicationSceneManifest и вызывается sceneDidEnterBackground.