> Какие способы запуска приложения на 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 в SceneDelegate
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else { return }
handleDeepLink(url)
}
// Обработка custom URL scheme
func 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.userInfo
if 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.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью