Android Deep Linking: Basic, Deferred və App Links İzahı
Bu gün deep linking haqqında danışacağam. Deep linking nədir? Sadə dillə desək, bu istifadəçini bir link vasitəsilə tətbiqin istənilən səhifəsinə aparan funksiyadır. Məsələn, dostunuz sizə bir məhsulun linkini göndərir, siz həmin linkə klikləyirsiniz və birbaşa tətbiqdə o məhsulun səhifəsi açılır.
Deep linkin 3 əsas növü var: Basic Deep Link, Deferred Deep Link və App Link. Hər birini ayrıca izah edək.
Basic Deep Link
Bu ən sadə növdür. Burada linkə klikləyəndə əgər tətbiq sizin telefonunuzda quraşdırılıbsa, link sizi birbaşa həmin səhifəyə aparır. Ancaq əgər tətbiq quraşdırılmayıbsa, heç nə baş vermir. Link sadəcə açılmır.
İndi maraqlı hissə — hər hansı tətbiqdə deep link istifadə edəcəksinizsə, bunu tətbiqin Manifest faylında tanıtmalısınız. Bəs bu tanıtmaq nə deməkdir?
Təsəvvür edin, siz bir linkə klikləyirsiniz. Bu zaman Android sistemi telefondakı bütün tətbiqlərin Manifest fayllarına baxır və soruşur: “Hansı tətbiq bu linki aça bilər?”
Burada arxa planda ne bas verir?
Bu an Android sistemi bir VIEW intent yaradır:
Intent(Intent.ACTION_VIEW,Uri.parse(“https://example.com/product/123"))
Sonra bu intenti sistem səviyyəsində bütün app-lara göndərir və deyir: “Kimdə bu tip (VIEW + bu URL) açmaq üçün uyğun intent-filter var?”Bu halda VIEW action ortaya çıxır. VIEW action — bu, tətbiqin ümumiyyətlə linkləri görə biləcəyini bildirir. Əgər VIEW varsa, sistem deyir “yaxşı, bu tətbiq linkə baxa bilər”. Yoxdursa, o tətbiq siyahıdan çıxır.
İkincisi BROWSABLE category. Bu nədir? Bu sadəcə bildirir ki, tətbiq browser-dən və ya digər tətbiqlərdən gələn linkləri qəbul edir. Yəni “mən xaricdən link qəbul edə bilərəm” deyir.
Üçüncüsü DEFAULT category. Bu nə işə yarayır? Android-də siz startActivity çağıranda sistem avtomatik olaraq DEFAULT category əlavə edir. Ona görə manifestdə də DEFAULT olmalıdır ki, sistem tətbiqi normal şəkildə işə sala bilsin. Əgər DEFAULT yoxdursa, sistem deyir “yox, bu işləməz” və tətbiqi açmır.
Yəni sistem yoxlayır: VIEW var? BROWSABLE var? DEFAULT var? Hər üçü varsa, sistem data ya baxir eger link uygundursa bu zaman android acir hemin tətbiqi. Data haqqinda məlumati asagida qeyd etmişəm.
Manifestdə bu belə görünür:
<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="www.example.com"
android:pathPrefix="/detail" />
</intent-filter>İndi linklərin strukturuna baxaq. Linklər necə qurulur? Onlar data hissəsində təyin olunur.
İlk hissə scheme-dir. Bu linkin protokoludur. Məsələn https və ya öz tətbiqinizin adı ola bilər.
İkinci hissə host-dur. Bu adətən tətbiq içində hansı modulun, səhifənin açılacağını göstərir.
Üçüncü hissə path və ya pathPrefix-dir. Path konkret bir səhifəni göstərir, pathPrefix isə daha geniş — yəni həmin prefikslə başlayan istənilən səhifəni aça bilər.
Basic deep link üçün nümunə:
- scheme: myshop (tətbiqinizin adı)
- host: cart (səbət modulu)
- pathPrefix: detail (məhsul detayı)
Yəni link belə olar: myshop://cart/detail
Tətbiq içində isə bu linkdən məlumatı belə oxuyursunuz:
val data = intent?.data
data?.let {
val itemId = it.lastPathSegment
// İndi bu itemId ilə müvafiq səhifəyə keçid edirsiniz
}Basic Deep Link nə zaman istifadə etməli?
Sadə hallarda və artıq tətbiq quraşdırmış istifadəçilər üçün. Məsələn, bildiriş göndərdiyiniz və istifadəçini konkret bir səhifəyə aparmaq istədiyiniz zaman.
Deferred Deep Link
Bu növ daha maraqlıdır. Burada istifadəçi linkə klikləyir. Əgər tətbiq quraşdırılıbsa, tətbiq açılır və həmin səhifə göstərilir. Ancaq əgər tətbiq quraşdırılmayıbsa nə olur? İstifadəçi Play Store-a yönəlir, tətbiqi yükləyir və ən əhəmiyyətlisi — yükləndikdən sonra birbaşa o linkin göstərdiyi səhifə açılır.
Yəni istifadəçi heç nə itirmir. Link kliklədi, tətbiq yoxdursa yüklənir, yükləndi və avtomatik olaraq həmin səhifə açılır. Bu çox rahatdır marketinq kampaniyaları üçün.
Bunu necə həyata keçiririk? Əvvəllər Firebase Dynamic Link istifadə edirdik, amma Firebase bu xidməti 25 avqust 2025-ci ildə tamamilə bağlayır. Səbəb isə Android-də yeni metodların — məsələn App Link-in — daha müasir və təhlükəsiz olmasıdır.
İndi əsasən üç yol var: Branch.io istifadə etmək, öz backend həllinizi yazmaq və ya HTML + Intent fallback metodunu istifadə etmək.
Branch.io ilə Deferred Deep Link
Branch.io istifadə edəndə ilk öncə gradle-ə əlavə edirsiniz:
dependencies {
implementation 'io.branch.sdk.android:library:5.+'
}Sonra Manifestdə konfiqurasiya edirsiniz:
<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="exampleapp" android:host="open"/>
</intent-filter>
</activity>Və tətbiqdə Branch SDK-nı işə salırsınız:
class MainActivity : AppCompatActivity() {
override fun onStart() {
super.onStart()
Branch.getInstance().initSession({ referringParams, error ->
if (error == null) {
val itemId = referringParams?.getString("id")
showDetail(itemId)
}
}, this.intent.data, this)
}
}Branch.io avtomatik olaraq görür ki, istifadəçi əvvəl linkə klikləyib, sonra tətbiqi yükləyib və ona həmin linkin parametrlərini verir. Branch.io Firebase-dən fərqli olaraq öz serveri və SDK-sı ilə işləyir və Firebase platformasına bağlı deyil.
Get Aminabbasov’s stories in your inbox
Join Medium for free to get updates from this writer.
Öz backend həlliniz
Başqa bir yol isə öz backend həllinizi yaratmaqdır. Burada link kliklənəndə serverinizə yönəlir, server görür ki, tətbiq quraşdırılmayıb və istifadəçini Play Store-a göndərir. Tətbiq quraşdırıldıqdan sonra açılışda serverdən məlumat alır və müvafiq səhifəyə keçid edir.
Məsələn: link https://example.com/detail?id=123 kliklənir, server quraşdırılmamış istifadəçini Play Store-a yönləndirir, tətbiq açıldıqda serverdən id=123 məlumatı alınır.
HTML + Intent fallback
Hətta daha sadə bir yol var — HTML + Intent fallback. Burada sadə bir HTML səhifə yaradırsınız:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Redirecting...</title>
<script>
window.onload = function() {
const appScheme = "exampleapp://detail";
const playStoreUrl = "https://play.google.com/store/apps/details?id=com.example.applinksdemo";
window.location = appScheme;
setTimeout(function() {
window.location = playStoreUrl;
}, 2000);
};
</script>
</head>
<body>
<p>Redirecting...</p>
</body>
</html>Burada nə baş verir? İstifadəçi linkə klikləyir, səhifə açılır və səhifə cəhd edir tətbiqi açmağa. Əgər tətbiq varsa açılır. Yoxdursa 2 saniyə sonra Play Store-a yönəlir.
Deferred Deep Link nə zaman istifadə etməli?
Marketinq kampaniyalarında, yeni istifadəçilər cəlb edərkən və sosial media reklamlarında. Məsələn, Instagram reklamı verirsiniz, istifadəçi linkə klikləyir, tətbiq yoxdursa yüklənir və birbaşa kampaniya səhifəsinə düşür.
App Link
Bu ən güclü və ən təhlükəsiz növdür. Burada linkə klikləyəndə birbaşa tətbiq açılır. Heç bir seçim dialoqu göstərilmir. Əgər tətbiq quraşdırılmayıbsa, tətbiqin vebsaytı açılır.
App Link-in Basic Deep Link-dən əsas fərqi nədir? App Link-də mütləq https protokolu istifadə olunur və sistem avtomatik yoxlayır ki, bu domen həqiqətən bu tətbiqə aiddir.
Manifestdə konfiqurasiya əvvəlki kimidir, ancaq bir neçə fərq var:
<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="www.example.com"
android:pathPrefix="/detail" />
</intent-filter>Diqqət edin — scheme hissəsində https var. Custom scheme yox, real https protokolu. Host hissəsində isə real saytın domaini var. Burada `autoVerify=”true”` parametri çox vacibdir. Bu nə edir? Android 6.0 və yuxarı versiyalarda bu parametr varsa, tətbiq quraşdırılarkən sistem avtomatik olaraq yoxlayır ki, bu domen həqiqətən bu tətbiqə aiddir. Əgər hər şey düzgündürsə, tətbiq həmin domenlər üçün “default handler” olur və link açılarkən heç bir seçim dialoqu göstərilmir — birbaşa tətbiq açılır. İndi ən vacib hissə — App Link işləməsi üçün mütləq tətbiqin vebsaytı olmalıdır. Və həmin vebsaytda `.well-known/assetlinks.json` faylı olmalıdır. Bu fayl nəyə lazımdır? Bu fayl Android-ə deyir: “bəli, bu domen bu tətbiqə aiddir”. Yəni saytınız təsdiqləyir ki, bu tətbiq həqiqətəndir və bu domenlə əlaqəlidir. Əks halda istənilən adam öz tətbiqində sizin saytınızın domenini yaza bilərdi. Faylın URL-i belə olmalıdır:
https://www.example.com/.well-known/assetlinks.json
assetlinks.json faylının strukturu belədir:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.applinksdemo",
"sha256_cert_fingerprints": ["11:22:33:44:55:66:..."]
}
}]Gəlin hər hissəni izah edək:
relation hissəsi deyir ki, aşağıdakı tətbiqə icazə verirəm URL-ləri idarə etməyə. delegate_permission/common.handle_all_urls ifadəsi deməkdir ki, bu tətbiq həmin domendəki bütün URL-ləri handle edə bilər.
target hissəsində isə hansı tətbiqin bu icazəyə sahib olduğu göstərilir.
namespace həmişə android_app olur, çünki bizim hədəfimiz Android tətbiqidir. iOS üçün ios_app, veb üçün web ola bilər, amma App Link üçün həmişə android_app yazılır.
package_name tətbiqin adıdır. Bunu Manifest faylından götürürsünüz. Android bu adı görəndə bilir ki, bu domen konkret bu tətbiqə bağlıdır.
sha256_cert_fingerprints ən vacib hissədir. Bu sizin tətbiqinizin imza sertifikatının barmaq izidir. Android bu barmaq izi ilə təsdiqləyir ki, bu tətbiq həqiqətən Google Play-də və ya cihazda eyni imza ilə imzalanıb. Əgər kimsə eyni package_name ilə saxta tətbiq yaratsa belə, fərqli sha256 barmaq izi olacaq və Android onu tanımayacaq.
Bu barmaq izini necə alırsınız? Terminalda bu əmri yazırsınız:
bash
keytool -list -v -keystore my-release-key.keystore -alias my-key-alias -storepass your_password -keypass your_passwordBu əmr sizə tətbiqinizin SHA256 barmaq izini verir. Onu kopyalayıb assetlinks.json faylına yapışdırırsınız.
Çoxlu domen və subdomain
Əgər birdən çox domen və ya subdomain varsa, hər biri üçün ayrıca assetlinks.json faylı yaratmalısınız. Məsələn, www.example.com və shop.example.com fərqli domenlərdir və hər birində assetlinks.json olmalıdır.
Həmçinin Manifestdə də hər domain üçün ayrıca <data> tag-ı əlavə etməlisiniz:
<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="www.example.com" />
<data android:scheme="https" android:host="shop.example.com" />
</intent-filter>Bir şeyi də qeyd edim ki, App Link ilə, əgər tətbiq quraşdırılmayıbsa, telefon bu halda Play Store-a yönləndire bilerik. Bu zaman App Link + HTML + Intent fallback üsulundan istifadə edə bilərik.
App Link nə zaman istifadə etməli?
Təhlükəsizlik vacib olduqda və rəsmi linklərdə. Məsələn, bank tətbiqləri, ödəniş sistemləri və ya sosial media platformaları App Link istifadə etməlidir. Çünki bu, saxta tətbiqlərin sizin domenlərinizdən istifadə etməsinin qarşısını alır.
Yekun
Beləliklə, deep linking sizə imkan verir istifadəçiləri birbaşa tətbiqin müəyyən səhifələrinə aparmağa, marketinq kampaniyalarınızı daha effektiv etməyə və istifadəçi təcrübəsini yaxşılaşdırmağa.
Hər bir növün öz istifadə sahəsi var:
- Basic Deep Link: Sadə hallarda, artıq tətbiq olan istifadəçilər üçün
- Deferred Deep Link: Yeni istifadəçilər cəlb edərkən, marketinq kampaniyalarında
- App Link: Təhlükəsizlik vacib olduqda, rəsmi və bank tətbiqlərində
Hansı növü seçməyiniz layihənizin tələblərindən asılıdır. Amma ümumi tendensiya App Link istiqamətindədir, çünki o həm təhlükəsiz, həm də istifadəçi təcrübəsi baxımından daha yaxşıdır.






