Вопрос проверяет понимание механизма диплинков (deep links) в iOS-приложении, их назначения для навигации пользователей извне в конкретные разделы приложения.
Диплинки (deep links) — это механизм, позволяющий открывать мобильное приложение и сразу переходить на определённый экран или выполнять конкретное действие, используя специальную ссылку. Это критически важно для улучшения пользовательского опыта, так как связывает веб-контент, уведомления или другие приложения с вашим нативным приложением.
В iOS существует два основных подхода:
myapp://profile?id=123. Они просты в настройке, но не являются стандартными HTTP-ссылками и могут конфликтовать с другими приложениями, использующими ту же схему.https://example.com/profile/123), которые iOS может ассоциировать с вашим приложением. Они более безопасны и приоритетны: если приложение установлено, ссылка откроет его; если нет — откроется веб-сайт.Для настройки кастомной схемы нужно:
Info.plist файл проекта.application(_:open:options:) (AppDelegate) или scene(_:openURLContexts:) (SceneDelegate).Пример добавления схемы в Info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>Пример обработки в AppDelegate:
func application(_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
guard url.scheme == "myapp" else { return false }
// Извлекаем путь и параметры
if url.host == "profile", let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems {
let userId = queryItems.first(where: { $0.name == "id" })?.value
// Навигация к экрану профиля с userId
navigateToProfile(with: userId)
return true
}
return false
}Настройка сложнее, но обеспечивает лучший опыт:
applinks:yourdomain.com.https://yourdomain.com/.well-known/apple-app-site-association разместите JSON-файл (без расширения .json), который связывает пути с идентификатором вашего приложения.application(_:continue:restorationHandler:) или соответствующем методе SceneDelegate.Пример файла apple-app-site-association:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.com.yourapp.bundle",
"paths": [ "/profile/*", "/news/*" ]
}
]
}
}Пример обработки Universal Link:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL else {
return false
}
// Парсим URL и навигируем
handleIncomingUniversalLink(incomingURL)
return true
}Вывод: Используйте кастомные URL-схемы для простых внутренних сценариев или когда у вас нет контролируемого домена. Universal Links — предпочтительный и более надёжный способ для публичных ссылок, так как они интегрируются с экосистемой iOS (Safari, Messages) и обеспечивают плавный переход между веб-сайтом и приложением.