Додаток не відкривається за посиланням з листа? Користувачі скаржаться, що сайт відкривається в браузері, а не в додатку? Universal Links вирішують цю проблему безпосередньо: посилання виду https://example.com/product/123 відкриває додаток на потрібному екрані, минаючи браузер. Жодних кастомних схем (myapp://product/123), які не працюють в Safari та блокуються корпоративними MDM. Ми, команда мобільних розробників з досвідом понад 5 років, налаштували Universal Links для 15+ iOS-проектів із загальною аудиторією понад 2 млн користувачів. На одному з проектів з аудиторією 500 тисяч користувачів ми виявили, що користувачі не могли перейти з email-розсилки в конкретний товар — конверсія впала на 20%. Після впровадження Universal Links вона відновилася і зросла на 15%. У цій статті — перевірена методика та типові граблі.
Чому Universal Links кращі за кастомні схеми?
Кастомні URL-схеми (myapp://) мають фундаментальні недоліки:
- Не працюють в Safari за замовчуванням — користувач бачить помилку «Не вдалося відкрити додаток».
- Не підтримуються в корпоративних MDM-середовищах.
- Не мають fallback на веб-версію.
Universal Links позбавлені цих проблем: вони використовують стандартний HTTPS, підтримують fallback на сайт і не вимагають додаткових дій від користувача. Безпека вища — схема не може бути перехоплена іншим додатком.
| Критерій | Universal Links | Custom URL Scheme |
|---|---|---|
| Робота в Safari | Так | Ні (помилка) |
| Fallback на сайт | Автоматично | Потрібен JS |
| MDM-сумісність | Так | Ні |
| Безпека | Висока (https) | Низька |
Як працюють Universal Links і де вони ламаються?
AASA-файл. На сервері за адресою https://example.com/.well-known/apple-app-site-association має лежати JSON без розширення файлу, з заголовком Content-Type: application/json, доступний по HTTPS без редиректів. Apple парсить цей файл при встановленні додатку та кешує на CDN — оновлення може зайняти до 24 годин.
Найпоширеніша помилка: сервер віддає файл з редиректом з http на https, або з 301 на www-версію домену. Apple не слідує редиректам при завантаженні AASA. Перевіряємо через curl -v https://example.com/.well-known/apple-app-site-association — має повернути 200 з правильним Content-Type.
Формат для iOS 13+ (applinks з details):
{ "applinks": { "details": [{ "appIDs": ["TEAMID.com.example.app"], "components": [ { "/": "/product/*", "comment": "Product pages" }, { "/": "/order/*" } ] }] } } App Entitlements. У Entitlements.plist потрібен com.apple.developer.associated-domains із записом applinks:example.com. Забутий entitlement — додаток просто не отримує universal link колбек.
Обробка в коді. У AppDelegate або SceneDelegate реалізуємо application(_:continue:restorationHandler:) (UIKit) або onOpenURL (SwiftUI). Отримуємо NSUserActivity з типом NSUserActivityTypeBrowsingWeb та webpageURL. Парсимо шлях, визначаємо потрібний екран, будуємо навігаційний стек.
Розбір URL має бути стійким: webpageURL може прийти з query-параметрами, фрагментами, у верхньому регістрі. Використовуємо URLComponents замість ручного розбору рядків.
Тестування. У симуляторі universal links працюють через xcrun simctl openurl booted 'https://example.com/product/123'. На реальному пристрої — через Safari (довге натискання на посилання → «Відкрити в додатку»). Xcode → Diagnostics не покаже проблему з AASA — потрібен swcutil на Mac та Console.app для логів swcd (Apple's universal links daemon).
Режим розробника (developer mode)
Для enterprise-додатків або staging-оточень додаємо applinks:example.com?mode=developer в entitlements. У цьому режимі iOS не кешує AASA і запитує файл безпосередньо з сервера — зручно при розробці.
Як перевірити, що AASA-файл коректний?
Для перевірки виконайте наступні кроки:
- Виконайте
curl -v https://example.com/.well-known/apple-app-site-association. ОчікуйтеHTTP/1.1 200 OKтаContent-Type: application/json. - Використовуйте AASA Validator від Apple (вбудований в Apple Developer). Apple Developer Documentation рекомендує цей інструмент.
- На Mac відкрийте Console.app, відфільтруйте по
swcd— побачите логи завантаження AASA. - На iOS: у Safari введіть посилання, після відкриття додатку перевірте логи через пристрій.
Типові проблеми при налаштуванні
Часто розробники стикаються з тим, що посилання відкриває сайт замість додатку. Причина — AASA-файл недоступний або невірний: сервер віддає редирект або неправильний формат. Рішення — видалити редиректи та перевірити відповідність формату iOS 13+. Інша проблема — universal link не обробляється через відсутність entitlement com.apple.developer.associated-domains у цільовому таргеті. Третя — AASA-файл не оновлюється через кешування Apple (до 24 годин). Для прискорення використовуйте developer mode.
Сценарії та edge-cases
Кілька доменів. Додаток може обробляти до 5 доменів — просто додаємо кілька записів в entitlements. AASA потрібен на кожному домені окремо.
Посилання з email-клієнтів. Gmail та Outlook в додатках на iOS обгортають посилання через свій redirect-сервіс. Universal link у цьому випадку не спрацьовує — Apple бачить redirect URL, а не цільовий. Це обмеження платформи, не баг у реалізації.
Що входить у роботу
- Налаштування AASA-файлу на сервері з потрібними патернами шляхів
- Entitlements та конфігурація в Xcode для всіх таргетів і схем (Debug, Release, Staging)
- Реалізація обробника в
SceneDelegate/AppDelegateз роутингом на потрібні екрани - Тестування на реальних пристроях та через симулятор
- Перевірка через Apple's validator та логи swcd
- Гарантія коректної роботи на iOS 14+ (перевірено на 15+ проектах)
Зв'яжіться з нами для обговорення вашого проекту. Замовте налаштування під ключ та отримайте консультацію інженера з досвідом понад 5 років.
Строки
Реалізація з кількома патернами шляхів та інтеграцією в існуючу навігацію: від 1 до 2 днів. З підтримкою кількох доменів та кастомною логікою роутингу — від 2 до 3 днів. Вартість розраховується індивідуально.
Отримайте консультацію інженера — ми допоможемо розібратися з вашим проектом.







