Android'de deep link'leri nasıl yapılandırılır ve istenen ekran nasıl açılır

Kerem Aydın·7 Temmuz 2026·⏱3 dk

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

TürÖrnekNe zaman seçilmeli
Özel şemamyapp://p/123Alan adı yok, hızlı başlangıç, dahili senaryolar
Web deep linkhttps://example.com/p/123MVP aşamasında, App Links henüz hazır değilse (uygulama/tarayıcı seçimi çıkabilir)
Android App Linkshttps://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-filter ekleyin.

"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ı.

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-filter yapılandırılmış ancak BROWSABLE yok → harici uygulamalardan açılmaz.
  • onNewIntent() işlenmemiş → uygulama zaten çalışırken "yanlış" ekran açılır.
  • Çok dar pathPrefix/host/scheme hatası → eşleşme çalışmaz.
  • App Links doğrulanmamış: yanlış SHA‑256, hatalı /.well-known/assetlinks.json yolu, package_name uyuş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.