> Что такое диплинкинг в iOS (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: bnine

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Диплинкинг (deep linking) в iOS - это механизм, который позволяет открывать конкретный экран или выполнять определённое действие внутри приложения по ссылке, минуя главный экран. Ссылка может быть обычной URL-схемой (например, myapp://profile/123) или универсальной ссылкой (Universal Link), ведущей на ваш домен. iOS передаёт ссылку в приложение, а вы обрабатываете её и навигируете пользователя в нужное место.

Подробное объяснение

В iOS есть два основных способа реализации диплинкинга:

URL Scheme - вы регистрируете кастомную схему (например, myapp://). Когда система встречает такую ссылку, она открывает ваше приложение и передаёт полный URL в метод application(_:open:options:) в AppDelegate или через onOpenURL в SwiftUI. Минус - схема не уникальна, другая app может зарегистрировать такую же.

Universal Links - вы привязываете домен к вашему приложению через файл apple-app-site-association, размещённый на сервере. Ссылка вида https://example.com/profile/123 открывает приложение, если оно установлено, иначе - сайт. Это более безопасный и рекомендуемый Apple подход.

Обработка диплинка обычно включает:

  • парсинг URL (путь, query-параметры);
  • определение целевого экрана или действия;
  • навигацию (например, через NavigationStack или UINavigationController);
  • обработку случая, когда приложение ещё не запущено или находится в фоне.

На практике

Для junior-позиции важно понимать разницу между URL Scheme и Universal Links, уметь обрабатывать ссылку в AppDelegate и в SwiftUI, а также знать, как передать данные на нужный экран. Часто диплинкинг используется для:

  • push-уведомлений (переход по тапу на уведомление);
  • email-рассылок и QR-кодов;
  • шеринга контента между пользователями.

На практике вам могут дать задачу: "Реализуй обработку ссылки, которая открывает экран профиля с переданным ID". Нужно будет распарсить URL, извлечь ID и передать его в view model или напрямую во view.

Пример кода

Пример обработки Universal Link в SwiftUI:

SWIFT
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
handleDeepLink(url)
}
}
}
func handleDeepLink(_ url: URL) {
guard url.host == "example.com" else { return }
let pathComponents = url.pathComponents
if pathComponents.count > 1, pathComponents[1] == "profile" {
let userID = pathComponents[2]
// навигация на экран профиля с userID
}
}
}

Для URL Scheme в AppDelegate:

SWIFT
func application(_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
if url.scheme == "myapp", url.host == "profile" {
let userID = url.lastPathComponent
// навигация
return true
}
return false
}

Как отвечать на собеседовании

Начните с определения, затем кратко опишите два подхода. Упомяните, что Universal Links предпочтительнее из-за безопасности и уникальности. Приведите простой пример обработки. Если спросят про сложные сценарии - скажите, что можно использовать координатор или роутер для централизованной обработки всех ссылок. Не углубляйтесь в детали, если не просят.

Что проверяет интервьюер

  • Понимание базовых концепций навигации в iOS.
  • Знание AppDelegate lifecycle и SwiftUI environment.
  • Умение парсить URL и извлекать параметры.
  • Понимание разницы между URL Scheme и Universal Links.
  • Способность объяснить, как передать данные между экранами.

Типичные ошибки

  • Путаница между URL Scheme и Universal Links.
  • Игнорирование случая, когда приложение уже запущено (нужно обрабатывать onOpenURL, а не только didFinishLaunching).
  • Необработка ошибок парсинга (например, отсутствие ID в ссылке).
  • Попытка использовать диплинкинг для внутренней навигации вместо обычных переходов.
  • Забывают про apple-app-site-association и проверку домена для Universal Links.

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

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