URL Scheme — це кастомний URI-протокол, який мобільний додаток реєструє в операційній системі для відкриття за посиланнями виду myapp://path. Згідно з RFC 3986, схема URI визначає синтаксис і семантику всіх наступних компонентів адреси. При переході на таке посилання система ідентифікує зареєстрований додаток за унікальним ідентифікатором і запускає його з вилученими з посилання параметрами. Deep link на основі URL Scheme залишається базовим механізмом міжпрограмної навігації на мобільних платформах, незважаючи на появу більш сучасних альтернатив.
Головне
URL Scheme — це унікальний ідентифікатор протоколу, який додаток реєструє в операційній системі для отримання викликів за кастомними посиланнями. Коли користувач переходить за посиланням виду myapp://profile/123, система визначає додаток, що зареєстрував схему myapp, і передає йому керування з повним URI. Такий механізм дозволяє додаткам обмінюватися даними та відкривати один одного без участі серверної інфраструктури.
Концепція URL Scheme безпосередньо запозичена з веб-стандартів RFC 3986, де URI-схема є першим компонентом будь-якого універсального ідентифікатора ресурсу. У мобільній розробці ця ідея адаптована для міжпрограмної комунікації, де замість HTTP-сервера виступає сам додаток-обробник посилання.
Багато популярних додатків реєструють власні URL Scheme для інтеграції зі сторонніми сервісами. Наприклад, Spotify використовує схему spotify://, Telegram — tg://, а Instagram — instagram://. Розробники також часто створюють схему виду appname:// для внутрішньої навігації та наскрізного тестування екранів.
URL Scheme, як і раніше, широко застосовуються в push-сповіщеннях, email-розсилках та QR-кодах, де потрібен миттєвий перехід до конкретного розділу додатка. Однак починаючи з iOS 9 та Android 6 з'явилися альтернативні механізми, які поступово доповнюють та замінюють голі схеми.
Структура кастомного URI підпорядковується загальній специфікації RFC 3986 і складається з кількох компонентів. Схема вказується першою і відокремлюється двокрапкою від решти адреси. Після схеми можуть слідувати хост, порт, шлях, query-параметри та фрагмент, кожен з яких є опціональним.
Повний синтаксис виглядає як scheme://host/path?key=value#fragment. Схема є єдиним обов'язковим елементом, решта визначаються потребами конкретної реалізації. Подвійний слеш після схеми історично запозичений з HTTP і не є строго обов'язковим за специфікацією, але повсюдно використовується як угода.
Для наочного представлення структури URI використовується таблиця компонентів. Кожен елемент має своє призначення та рівень обов'язковості.
| Компонент | Приклад | Обов'язковість |
|---|---|---|
| Scheme | myapp | Так |
| Host | profile | Ні |
| Path | /user/42 | Ні |
| Query | ?id=42&tab=main | Ні |
| Fragment | #section2 | Ні |
Розробники можуть довільно вибирати структуру URI, що створює гнучкість, але породжує проблеми сумісності між різними версіями додатка. Рекомендується документувати формат URL Scheme як частину публічного API додатка і версіонувати його при зміні.
iOS вимагає явної реєстрації кожної URL Scheme у файлі Info.plist проекту. Розробник додає масив CFBundleURLTypes, кожен елемент якого містить ідентифікатор (CFBundleURLName) та список підтримуваних схем (CFBundleURLSchemes). Після реєстрації система автоматично направляє всі вхідні виклики за зареєстрованими схемами в додаток.
Обробка вхідного URL Scheme відбувається в делегаті додатка через метод application(_:open:options:). Цей метод отримує об'єкт URL, з якого вилучається шлях та query-параметри для прийняття рішення про навігацію. Обробка повинна повертати Bool-значення, що вказує на успішність операції.
Нижче наведено приклад реалізації обробника URL Scheme мовою Swift. Код демонструє вилучення хоста та query-параметрів із вхідного URI за допомогою URLComponents.
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any]
) -> Bool {
let host = url.host
let params = URLComponents(
url: url,
resolvingAgainstBaseURL: false
)?.queryItems
if host == "profile" {
navigateToProfile(params)
}
return true
}
Метод використовує URLComponents для безпечного парсингу query-параметрів. Цей підхід є кращим за ручний розбір рядка, оскільки автоматично обробляє відсоткове кодування та декодування спеціальних символів у значеннях параметрів.
Android використовує систему Intent Filter для маршрутизації deep link на основі URL Scheme. Розробник оголошує фільтр в AndroidManifest.xml всередині тега Activity, яка повинна обробляти посилання. Фільтр містить action VIEW, категорії BROWSABLE та DEFAULT, а також тег data із зазначенням схеми, хоста та pathPrefix.
Коли користувач переходить за посиланням з кастомною схемою, система перевіряє Intent Filter всіх встановлених додатків. Якщо знайдено кілька відповідних додатків, користувачеві пропонується діалог вибору. Категорія BROWSABLE дозволяє обробку посилання з браузера.
Приклад оголошення Intent Filter в AndroidManifest.xml для обробки схеми myapp на Activity. Комбінація action та category обов'язкова для коректної маршрутизації deep link.
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile"
android:pathPrefix="/user" />
</intent-filter>
</activity>
Після налаштування фільтра в Activity необхідно викликати intent.getData() для отримання URI. Важливо перевіряти intent та дані на null, оскільки Activity може бути запущена без вхідного deep link, наприклад при стандартному запуску з лаунчера.
Query-параметри в URL Scheme передаються після знака питання у форматі ключ=значення, розділені амперсандом. Цей формат ідентичний HTTP-запитам і легко обробляється стандартними засобами платформи. Параметри повинні бути закодовані за допомогою відсоткового кодування для всіх символів, що не входять до допустимого набору URI.
Приклад повного посилання з параметрами: myapp://profile?userId=42&source=email&ref=abc123. Після вилучення URL додаток послідовно парсить всі query-items і на основі їх значень приймає рішення про навігацію на цільовий екран.
При передачі складних даних важливо враховувати обмеження на довжину URI. В iOS максимальна довжина URL Scheme обмежена 2 КБ, після чого система обрізає посилання. В Android ліміт становить близько 8 КБ, але точне значення залежить від версії ОС та виробника пристрою. Для великих обсягів даних рекомендується передавати лише ідентифікатор сесії через URL Scheme, а решту даних завантажувати з сервера.
Основний недолік URL Scheme — неможливість обробити посилання, якщо додаток не встановлено на пристрої. Браузер відображає помилку, і користувач втрачає контекст переходу. Для вирішення цієї проблеми Apple впровадила Universal Links в iOS 9, а Google — App Links в Android 6. Обидва механізми реєструються через веб-домен, прив'язаний до додатка.
Universal Links та App Links працюють як звичайні HTTPS-посилання, але за наявності додатка відкривають його без діалогу вибору. Якщо додаток не встановлено, посилання відкриває веб-сторінку на тому ж домені, зберігаючи користувацький досвід. Це робить їх кращою альтернативою для production-середовища.
Для URL Scheme на iOS та Android немає вбудованого механізму fallback. Розробники використовують проміжні серверні рішення: посилання веде на веб-сторінку, яка перевіряє встановлення додатка через JavaScript і перенаправляє або на схему, або в магазин додатків. Firebase Dynamic Links та Branch.io пропонують готові рішення цієї проблеми з підтримкою deferred deep link, які автоматично визначають статус встановлення та маршрутизують користувача без необхідності розробляти власний серверний пайплайн.
Додаткова складність виникає при використанні URL Scheme в iOS 15+ та Android 12+, де посилено правила конфіденційності. Safari блокує спроби відкрити незареєстровану схему без попереднього підтвердження, а Android 12 обмежує видимість встановлених додатків через PackageManager. Ці зміни роблять використання URL Scheme для міжпрограмної взаємодії менш надійним, ніж у ранніх версіях платформ.
Часті запитання
URL Scheme використовує кастомний протокол без шифрування, а Universal Links працюють через HTTPS з верифікацією домену. Universal Links не викликають діалог вибору додатка і коректно обробляються за відсутності додатка на пристрої.
Так, але всі не-ASCII символи повинні бути закодовані через percent-encoding згідно з RFC 3986. Рекомендується уникати кирилиці в URL Scheme для забезпечення сумісності зі старими версіями ОС та браузерів.
Обмежень на кількість схем немає ні в iOS, ні в Android. На практиці додатки використовують від однієї до п'яти схем. Наприклад, Telegram реєструє схеми tg://, t.me/, telegram:// та telegram.me://.
В iOS використовується метод canOpenURL(_:), який повертає true за наявності зареєстрованої схеми. В Android перевірка виконується через PackageManager.queryIntentActivities(). Обидві платформи вимагають попереднього зазначення схеми в конфігурації.
Ні, URL Scheme не шифрує дані. Будь-який додаток, що зареєстрував ту саму схему, може перехопити посилання. Для безпеки використовуйте Universal Links з HTTPS або наскрізне шифрування даних на рівні протоколу.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також