App Link је механизам Android (Android 6.0+) који аутоматски отвара веб линкове у инсталираној апликацији, прескачући дијалог избора. Термин је увео Google 2015. године заједно са Android 6.0 Marshmallow. Према Android Developers, App Link користи Digital Asset Links — криптографску верификацију путем фајла на серверу, која потврђује да домен припада програмеру апликације.
Главно
App Link (Android App Link) — стандардни HTTPS линк који при клику на Android уређају аутоматски отвара инсталирану апликацију без приказивања стандардног дијалога избора између прегледача и апликације. Google је представио App Link у Android 6.0 (API 23) као решење проблема „дијалога избора" који је смањивао конверзију deep link-а због додатног клика и забуне корисника.
Кључна иновација: верификација. Android проверава да ли домен заиста припада програмеру апликације путем Digital Asset Links API-ја. Google Play Store проверава App Link при објављивању и може одбити ажурирање ако верификација не успе. Ово чини App Link сигурнијим од Custom URL Scheme: ниједна друга апликација не може пресрести линк ка вашем домену.
Digital Asset Links — отворени протокол који Google користи не само за App Link, већ и за повезивање веб сајтова са апликацијама у резултатима претраге, Google Assistant-у и Smart Lock for Passwords-у. Протокол се заснива на криптографској верификацији: у assetlinks.json се наводи SHA256 отисак сертификата потписа апликације, што искључује фалсификовање.
Процес рада App Link-а састоји се од три фазе: верификација Digital Asset Links, обрада кроз Intent Filter и аутоматско преусмеравање. Свака фаза је обавезна. Ако верификација не успе, Android приказује дијалог избора — такав deep link ради као обичан, али без предности аутоматског преусмеравања.
Asset Links — JSON фајл постављен на серверу на адреси https://domen/.well-known/assetlinks.json. Фајл садржи низ објеката са пољима: relation (низ стрингова који описују тип везе), target (објекат са namespace и package_name апликације, као и sha256_cert_fingerprints — низ SHA256 отисака сертификата потписа).
// assetlinks.json — минимална конфигурација App Link-а
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": [
"14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:AD:A4:C5:AD:6B:01:14:79:6B:CB:12:6B:21:39:6F:EA"
]
}
}]
SHA256 отисак се добија из сертификата којим је потписана апликација. За debug компилацију користи се стандардни Android debug сертификат, за release — сертификат из Google Play Console или ваш сопствени. Важно: при промени сертификата потписа (нпр. при преласку на App Signing by Google Play) потребно је ажурирати assetlinks.json на серверу, иначе App Link престаје да ради.
Android проверава App Link при првом клику на линк. Систем учитава assetlinks.json са сервера, упоређује package_name и SHA256 отисак са сертификатом инсталиране апликације. Ако се подаци поклапају, Android означава Intent Filter као верификован, и сви наредни линкови ка овом домену отварају се аутоматски, без дијалога.
// AndroidManifest.xml — Intent Filter за App Link
<activity
android:name=".ui.ProductActivity"
android:exported="true">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/product" />
</intent-filter>
</activity>
autoVerify="true" — обавезни атрибут који налаже Android-у да провери assetlinks.json. Без овог атрибута Intent Filter неће бити верификован, а App Link неће бити активиран. Android подржава више Intent Filter-а у једној Activity — за различите хостова. Систем проверава сваки хост посебно. Верификација се извршава асинхроно и може трајати до 20 секунди при првом прелазу.
Након успешне верификације, Android аутоматски отвара апликацију при клику на било који линк који одговара верификованом Intent Filter-у. Корисник не види дијалог избора — апликација се отвара тренутно. Ако апликација није инсталирана, линк се отвара у прегледачу (као обична веб страница). Ово је идеално корисничко искуство: беспрекорни прелаз без непотребних радњи.
Важно: аутоматско преусмеравање ради само за HTTPS шему. App Link не подржава HTTP (несигуран протокол). Ако корисник ручно отвори HTTP линк (нпр. из SMS-а), Android не врши верификацију и приказује дијалог избора. Препоручује се коришћење HTTPS-а за све линкове који воде ка апликацији и подешавање HTTP → HTTPS преусмеравања на серверу.
App Link је еволуција Deep Link-а на Android-у, а не замена. Разлика између њих је фундаментална. Обичан Deep Link (Custom URL Scheme) ради кроз Intent Filter са прилагођеном шемом (myapp://) и без autoVerify. Android не проверава да ли је апликација заиста повезана са овом шемом — било која апликација може регистровати myapp:// и пресретати линкове.
App Link решава три проблема Deep Link-а. Први: безбедност — верификација кроз Digital Asset Links искључује пресретање линкова. Други: корисничко искуство — одсуство дијалога избора повећава конверзију ка циљној радњи за 20–40%. Трећи: индексација — Google индексира HTTPS линкове App Link-а и може их приказати у резултатима претраге као линкове ка садржају унутар апликације.
Компатибилност: App Link ради на Android 6.0+ (99% уређаја). За Android 5.x (Lollipop) користи се обичан Deep Link са дијалогом избора. Због тога се препоручује подршка за оба механизма: App Link за модерне уређаје и Custom URL Scheme као fallback за старије верзије. Intent Filter са autoVerify="true" не квари уназад компатибилност — на Android < 6 атрибут се игнорише.
| Карактеристика | Deep Link | App Link |
|---|---|---|
| Шема | Прилагођена (myapp://) | HTTPS (https://domen) |
| Верификација | Не | assetlinks.json |
| Дијалог избора | Приказује се | Аутоматско преусмеравање |
| Android верзија | API 1+ | API 23+ (6.0+) |
| Google индексација | Не | Да (HTTPS URL) |
Подешавање App Link-а захтева три корака: конфигурација Intent Filter-а у манифесту, постављање assetlinks.json на сервер и провера верификације. Први корак — додавање Intent Filter-а са android:autoVerify="true" у AndroidManifest.xml. Важно је навести HTTPS шему, хост и путање које апликација треба да обрађује. Путање могу садржати wildcard (*) за подфасцикле.
Други корак — креирање assetlinks.json. Фајл се може генерисати кроз Android Studio (Tools → App Links Assistant). Асистент такође помаже при отклањању грешака и тестирању. Фајл се поставља на сервер на путањи /.well-known/assetlinks.json. Сервер мора враћати Content-Type: application/json и бити доступан преко HTTPS-а без преусмеравања. Google Play Console такође приказује статус верификације App Link-а у одељку Publishing.
Тестирање — трећи корак. Користите adb за проверу: команда adb shell am start -W -a android.intent.action.VIEW -d "https://example.com/product/42" отвара апликацију. Ако се уместо апликације отвори прегледач — проверите assetlinks.json и autoVerify. Android Studio App Links Assistant садржи уграђени тестер: приказује статус верификације за сваки домен и путању. За аутоматско тестирање користите Android Testing Library са Intent Matcher.
Android 12 (API 31) је увео измене у обраду App Link-а. Додата је нова верификација специфична за домен: систем проверава сваки линк посебно, а не цео Intent Filter. То повећава безбедност, али захтева ажурирање фајла assetlinks.json при додавању нових путања. Android 12 је такође увео Android App Links Assistant у оквиру ADB-а — команде за управљање верификацијом кроз shell.
Више домена — типичан сценарио за продукцију. Апликација може обрађивати линкове са example.com, m.example.com и example.org. За сваки домен је потребан посебан assetlinks.json на одговарајућем серверу. У манифесту се додаје више Intent Filter-а — по један за сваки домен. Сви домени морају бити доступни преко HTTPS-а и проћи верификацију независно.
App Link и Jetpack Navigation — препоручени начин обраде App Link-а у модерним Android апликацијама. Jetpack Navigation подржава декларативне deep link-ове у nav_graph.xml или кроз NavDeepLinkRequest. То поједностављује навигацију: програмер описује који екран се отвара под одређеним URL-ом, а Navigation компонента сама обрађује Intent и враћа стек навигације. Google препоручује коришћење управо Jetpack Navigation-а за App Link.
// Обрада App Link-а кроз Jetpack Navigation
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
handleDeepLink(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleDeepLink(intent)
}
private fun handleDeepLink(intent: Intent) {
intent.data?.let { uri ->
navController.handleDeepLink(NavDeepLinkRequest
.Builder
.fromUri(uri)
.build()
)
}
}
}
Google Play Store проверава App Link при објављивању. Ако је у манифесту наведен Intent Filter са autoVerify, али assetlinks.json није доступан или је неисправан, Google Play може одбити ажурирање са упозорењем. У конзоли програмера (Policy and Programs → App Links) приказује се статус верификације сваког домена. Пре објављивања обавезно проверите статус — исправка након одбијања ажурирања одлаже објављивање.
Често постављана питања
App Link — Deep Link са верификацијом кроз Digital Asset Links. Главне разлике: App Link користи HTTPS шему уместо прилагођене, не приказује дијалог избора и индексира га Google. Обичан Deep Link ради на свим верзијама Android-а, али захтева ручни избор апликације.
Фајл се поставља у корен HTTPS сервера на путањи /.well-known/assetlinks.json. Сервер мора враћати Content-Type: application/json. Фајл је потребно ажурирати при промени сертификата потписа или додавању нових домена.
Главни разлози: недостаје android:autoVerify="true" у Intent Filter-у, assetlinks.json није доступан преко HTTPS-а, неисправан SHA256 отисак, другачији сертификат потписа (debug vs release). Проверите статус верификације кроз adb shell dumpsync domain_verification.
Не — App Link захтева HTTPS сервер са доступним assetlinks.json. Ако немате домен, користите Firebase Hosting или GitHub Pages за хостовање фајла. Алтернатива: Custom URL Scheme (без верификације) или Firebase Dynamic Links.
Не — App Link је подржан на Android 6.0 (API 23) и новијим. На Android 5 Intent Filter са android:autoVerify="true" игнорише атрибут и ради као обичан Deep Link са дијалогом избора. Препоручује се подршка за оба механизма ради уназад компатибилности.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође