> Какие способы запуска приложения на iOS существуют кроме иконки и поиска, например через панель уведомлений или диплинки? (iOS, Swift)
Уровень: senior · Роль: qa · Категория: Технические вопросы
Компании: Ozon
Стек: iOS, Swift
> Пример ответа
Короткий ответ
Помимо иконки и поиска, приложение можно запустить через диплинки (universal links, custom URL schemes), push-уведомления (tap on notification), виджеты (widgets на home screen и lock screen), Siri Shortcuts и App Intents, Handoff (передача контекста между устройствами Apple), а также через системные события, например, открытие файлов определённого типа (document types) или взаимодействие с такими сервисами, как Siri, Spotlight (через NSUserActivity) и CarPlay. Также возможен запуск через App Clips и фоновые режимы (background fetch, push-уведомления с тихим контентом).
Подробное объяснение
Все способы запуска делятся на две категории: явный запуск (пользователь инициирует) и неявный (система или другой процесс). К явным относятся:
- Universal Links - HTTPS-ссылки, ассоциированные с доменом через apple-app-site-association. Открывают приложение без подтверждения, если оно установлено.
- Custom URL schemes - например,
myapp://path. Требуют регистрации схемы в Info.plist, работают только если приложение установлено. - Push-уведомления - при tap на уведомление система вызывает
didReceiveв UNUserNotificationCenterDelegate, приложение может быть запущено в фоне или foreground. - Widgets - виджеты на home screen, lock screen или today view. При тапе на виджет открывается приложение с переданным deep link через
widgetURLилиLink. - Siri Shortcuts / App Intents - пользователь может назначить голосовую фразу или добавить действие в Shortcuts, которое запускает приложение с параметрами.
- Handoff - передача активности между устройствами через iCloud, использует NSUserActivity.
- Document types - если приложение зарегистрировано как обработчик определённого типа файлов (например, PDF), то открытие такого файла из Files или Mail запустит приложение.
- App Clips - лёгкая версия приложения, запускаемая через NFC, QR-код или ссылку.
- Spotlight - через NSUserActivity с
isEligibleForSearchприложение может быть найдено и запущено из поиска.
Неявные способы:
- Background fetch - система периодически запускает приложение в фоне для обновления данных.
- Silent push - push с
content-available: 1без отображения уведомления, запускаетapplication(_:didReceiveRemoteNotification:)в фоне. - Location events - приложение может быть разбужено при входе/выходе из геозоны.
- Bluetooth / CoreBluetooth - wake по событиям от BLE-устройств.
- Background URLSession - завершение фоновой загрузки данных.
На практике
Для QA важно понимать, что каждый способ запуска имеет свои особенности тестирования:
- Universal links требуют проверки на реальном устройстве с установленным приложением и корректно размещённым файлом ассоциации.
- Custom URL schemes могут конфликтовать между приложениями - важно проверять, что при отсутствии приложения система показывает ошибку.
- Push-уведомления нужно тестировать в разных состояниях: foreground, background, terminated.
- Widgets - проверять, что deep link корректно передаёт контекст (например, открывает нужный экран).
- Handoff - требует двух устройств с одним Apple ID.
- Document types - проверять, что приложение появляется в списке "Открыть с помощью".
Также важно проверять сценарии, когда приложение уже запущено, но находится в фоне - в этом случае scene(_:willConnectTo:options:) и scene(_:openURLContexts:) вызываются по-разному в зависимости от того, был ли процесс жив.
Пример кода
SWIFT// Обработка universal link в SceneDelegatefunc scene(_ scene: UIScene, continue userActivity: NSUserActivity) {guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,let url = userActivity.webpageURL else { return }handleDeepLink(url)}// Обработка custom URL schemefunc scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {guard let url = URLContexts.first?.url else { return }handleDeepLink(url)}// Обработка tap на push-уведомлениеfunc userNotificationCenter(_ center: UNUserNotificationCenter,didReceive response: UNNotificationResponse,withCompletionHandler completionHandler: @escaping () -> Void) {let userInfo = response.notification.request.content.userInfoif let deepLink = userInfo["deepLink"] as? String {handleDeepLink(URL(string: deepLink))}completionHandler()}
Как отвечать на собеседовании
Начните с перечисления основных способов, затем сгруппируйте их по типу инициации. Для senior-позиции важно показать понимание жизненного цикла: как система передаёт контекст запуска в SceneDelegate и AppDelegate, в чём разница между cold start и warm start. Упомяните, что для каждого способа есть свои ограничения (например, universal links не работают в simulator без настройки, custom schemes нельзя использовать для проверки установленности приложения). Если спросят про QA - добавьте, что нужно проверять не только успешный запуск, но и edge cases: отсутствие приложения, конфликт схем, отказ от уведомлений, состояние terminated.
Что проверяет интервьюер
Интервьюер оценивает:
- широту знаний экосистемы iOS (не только иконка и диплинки);
- понимание жизненного цикла приложения и роли
SceneDelegate/AppDelegate; - умение различать явные и неявные способы запуска;
- знание ограничений и особенностей каждого механизма;
- способность структурировать ответ и выделять важное для QA;
- практический опыт - например, упоминание реальных кейсов тестирования.
Типичные ошибки
- Забывают про фоновые запуски (background fetch, silent push) - это тоже способы запуска, хотя и невидимые пользователю.
- Путают universal links и custom URL schemes - не объясняют разницу в механизме и требованиях.
- Не упоминают
NSUserActivityкак основу для Handoff, Spotlight и Siri. - Говорят только про
AppDelegate, игнорируяSceneDelegate- для современных приложений это критично. - Не учитывают, что виджеты и push-уведомления могут запускать приложение в фоне без явного действия пользователя.
- Для QA: не упоминают необходимость тестирования на реальном устройстве для universal links и push.
> Похожие задачи по qa
Где происходит настройка диплинков в Android и iOS?
Как оценить время тестирования приложения на Android и iOS по описанным кейсам?
Какой следующий этап после технического интервью
По какой методологии работаете
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью