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 известия, имейл кампании и 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 KB, след което системата съкращава връзката. В Android ограничението е около 8 KB, но точната стойност зависи от версията на операционната система и производителя на устройството. За големи обеми данни се препоръчва предаване само на идентификатор на сесията чрез URL Scheme, а останалите данни да се зареждат от сървъра.
Основният недостатък на URL Scheme — невъзможността да обработи връзката, ако приложението не е инсталирано на устройството. Браузърът показва грешка и потребителят губи контекста на прехода. За решаване на този проблем Apple въведе Universal Links в iOS 9, а Google — App Links в Android 6. И двата механизма се регистрират чрез уеб домейн, свързан с приложението.
Universal Links и App Links работят като обикновени HTTPS връзки, но при наличие на приложение го отварят без диалогов прозорец за избор. Ако приложението не е инсталирано, връзката отваря уеб страница на същия домейн, запазвайки потребителското изживяване. Това ги прави предпочитана алтернатива за производствена среда.
За URL Scheme на iOS и Android няма вграден механизъм за fallback. Разработчиците използват междинни сървърни решения: връзката води до уеб страница, която проверява инсталацията на приложението чрез JavaScript и пренасочва или към схемата, или към магазина за приложения. Firebase Dynamic Links и Branch.io предлагат готови решения на този проблем с поддръжка на deferred deep link, които автоматично определят статуса на инсталация и насочват потребителя без необходимост от разработване на собствен сървърен pipeline.
Допълнителна сложност възниква при използване на 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също