Android'de deep link'leri nasıl yapılandırılır ve istenen ekran nasıl açılır
Android'de deep link'ler, uygulamayı doğrudan belirli bir ekranda (ürün, profil, şifre sıfırlama) açan bağlantılardır. Bu işlem, manifest dosyasındaki intent-filter ve kod içindeki intent.data (URI) ayrıştırmasıyla yapılır; https bağlantıları için Android App Links ile alan adı doğrulaması kullanmak daha iyidir.
Bir alan adınız varsa App Links kullanın. Özel şema (myapp://...) yalnızca testler veya dahili entegrasyonlar için yedek seçenek olarak kalsın.
İçindekiler
Hangi bağlantılar kullanılmalı: şema, web, App Links
| Tür | Örnek | Ne zaman seçilmeli |
|---|---|---|
| Özel şema | myapp://p/123 | Alan adı yok, hızlı başlangıç, dahili senaryolar |
| Web deep link | https://example.com/p/123 | MVP aşamasında, App Links henüz hazır değilse (uygulama/tarayıcı seçimi çıkabilir) |
| Android App Links | https://example.com/p/123 | Üretim ortamı: alan adı doğrulamasından sonra doğrudan uygulamada açılır |
Pratikte çoğunlukla App Links + yedek çözüm desteklenir (uygulama yoksa site açılır), şema ise noktasal olarak eklenir.
AndroidManifest'te yapılandırma: intent-filter
https için minimum yapılandırma:
<activity
android:name=".MainActivity"
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="/p/" />
</intent-filter>
</activity>
VIEW+BROWSABLE— bağlantının tarayıcı/mesajlaşma uygulamalarından açılabilmesi için.pathPrefix="/p/"— benzer sayfalar (/p/123,/p/456) için kullanışlıdır.- Daha fazla eşleşme gerekiyorsa (profil, şifre sıfırlama), farklı yollar için ayrı
<data>veya ayrıintent-filterekleyin.
"Tarayıcıdan açılmıyor" sorununun yaygın nedeni: android.intent.category.BROWSABLE unutulmuş olması. Diğer bir neden ise intent-filter içeren Activity'de android:exported="true" belirtilmemiş olması.
App Links: assetlinks.json ve alan adı doğrulaması
https://example.com/... bağlantısının uygulama seçimi olmadan açılması için alan adının uygulama ile ilişkilendirilmesi gerekir:
/.well-known/assetlinks.json
Örnek yapı:
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["AA:BB:CC:...:11"]
}
}
]
Şunların eşleşmesi önemlidir:
package_name↔applicationId- SHA‑256 parmak izi ↔ gerçek release imzalama anahtarı (imzalamanın yerel olarak yapılmadığı durumlar dahil)
App Links release derlemesinde "doğrulanmıyorsa", genellikle yanlış SHA‑256 kullanılmıştır (debug yerine release alınmış veya imzalama anahtarı karıştırılmış).
İstenen ekranı açma: Kotlin ile URI ayrıştırma
Bağlantı intent.data üzerinden gelir. Hem soğuk başlatmayı hem de tekrar gelen intent'i işleyin:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handleDeepLink(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleDeepLink(intent)
}
private fun handleDeepLink(intent: Intent) {
val uri = intent.data ?: return
val segments = uri.pathSegments
when (segments.getOrNull(0)) {
"p" -> segments.getOrNull(1)?.let { openProduct(it) } ?: openHome()
"u" -> openProfile(segments.getOrNull(1))
"reset-password" -> openReset(uri.getQueryParameter("token"))
else -> openHome()
}
}
}
Ekran yetkilendirme gerektiriyorsa "gecikmeli" geçiş yapın: deep link'i kaydedin, giriş ekranını gösterin, başarılı olduktan sonra navigasyonu gerçekleştirin.
Test etme
Hızlı yöntem — ADB:
adb shell am start -a android.intent.action.VIEW -d "https://example.com/p/123"
Uygulama seçimini hariç tutmak için paketi belirtin:
adb shell am start -a android.intent.action.VIEW -d "https://example.com/p/123" com.example.app
Ayrıca notlar/e-posta/mesajlaşma uygulamalarından gerçek tıklamaları kontrol edin: bunlar yönlendirmeler ve parametreler ekleyebilir, bu da nihai URL'i değiştirebilir.
Yaygın hatalar
intent-filteryapılandırılmış ancakBROWSABLEyok → harici uygulamalardan açılmaz.onNewIntent()işlenmemiş → uygulama zaten çalışırken "yanlış" ekran açılır.- Çok dar
pathPrefix/host/schemehatası → eşleşme çalışmaz. - App Links doğrulanmamış: yanlış SHA‑256, hatalı
/.well-known/assetlinks.jsonyolu,package_nameuyuşmazlığı. - Güvensiz mantık: sunucu tarafı kontrolü olmadan URL parametrelerine (token'lar/ID'ler) güvenmek.
SSS
Hem App Links hem de özel şema aynı anda desteklenebilir mi?
Evet. Genellikle App Links ana kanal, şema ise testler ve özel entegrasyonlar için yedektir.
Neden bazen uygulama seçimi penceresi çıkar?
Çoğunlukla App Links doğrulamadan geçmemiştir veya kullanıcı daha önce varsayılan olarak tarayıcıda açmayı seçmiştir.
https varsa http eklemek gerekir mi?
Sadece gerçekten eski http bağlantılarınız kalıyorsa. Diğer durumlarda her şeyi https üzerine yönlendirmek ve hata yüzeyini genişletmemek daha iyidir.