Flutter & Mobil İle Derin Bağlantı Yönetimi Nasıl Yapılır?

Flutter & Mobil İle Derin Bağlantı Yönetimi Nasıl Yapılır?
Flutter & Mobil İle Derin Bağlantı Yönetimi Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Derin bağlantı yönetimine başlamadan önce, geliştirme ortamınızın güncel olduğundan emin olmalısınız. Flutter SDK sürümünüzün 3.24 veya üzeri olması, modern "App Links" ve "Universal Links" desteği için önerilir. Ayrıca, projenizin bir alan adına (domain) sahip olması gerekir; çünkü güvenli derin bağlantılar, uygulamanızın o alan adına ait olduğunu kanıtlayan bir doğrulama dosyası gerektirir.

  • Flutter SDK 3.24+
  • Android Studio veya VS Code (Güncel eklentilerle)
  • Doğrulanmış bir web sitesi (HTTPS zorunludur)
  • Firebase Dynamic Links veya manuel yapılandırma için gerekli konsol erişimleri

Android Manifest ve App Links Yapılandırması

Android tarafında derin bağlantıları yönetmek için AndroidManifest.xml dosyanızda intent-filter tanımlamanız gerekir. Bu, işletim sistemine uygulamanızın belirli URL'leri dinlediğini söyler. Modern yaklaşım olan "App Links", uygulamanızın web sitenizle olan sahiplik ilişkisini doğrular.

Buradaki autoVerify="true" parametresi, Android'in web sitenizdeki assetlinks.json dosyasını kontrol etmesini sağlar. Bu dosya, uygulamanızın paket adı ve imza sertifikası (SHA-256) ile eşleşmelidir.

iOS Universal Links Kurulumu

iOS tarafında derin bağlantılar "Universal Links" olarak adlandırılır. Bu bağlantılar, uygulamanız yüklü değilse web sayfasını, yüklüyse doğrudan uygulamayı açar. Bu işlem için Apple Developer hesabınızda "Associated Domains" yetkisini aktif etmelisiniz.

Projenizin Runner.entitlements dosyasına aşağıdaki yapılandırmayı ekleyerek uygulamanızın hangi domainleri dinleyeceğini belirtebilirsiniz:

com.apple.developer.associated-domains

    applinks:uygulamaniz.com

Bu yapılandırma, iOS cihazının web sitenizdeki apple-app-site-association dosyasını sorgulamasını sağlar. Bu dosya, sunucunuzun kök dizininde veya .well-known klasöründe bulunmalıdır.

Flutter İçerisinde Bağlantıları Yakalama

Flutter tarafında gelen bağlantıları yönetmek için uni_links veya Flutter'ın kendi go_router kütüphanesini kullanabilirsiniz. 2026 standartlarında, yönlendirme yönetimi için go_router kullanımı en temiz ve sürdürülebilir yöntemdir.

final GoRouter _router = GoRouter(
  routes: [
    GoRoute(
      path: '/urun/:id',
      builder: (context, state) => UrunDetaySayfasi(id: state.pathParameters['id']!),
    ),
  ],
);

Yukarıdaki kod bloğu, uygulama açıldığında veya arka plandan ön plana geldiğinde gelen URL'i ayrıştırır. /urun/123 şeklinde gelen bir bağlantı, otomatik olarak UrunDetaySayfasi'nı tetikler.

Derin Bağlantı Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
Custom Schemes (myapp://) Kurulumu çok basittir. Güvenlik riski taşır, uygulama yüklü değilse hata verir.
Universal/App Links En güvenli yöntemdir, web ile entegredir. Sunucu tarafında doğrulama dosyası gerektirir.

Güvenlik ve Hata Ayıklama İpuçları

Kritik Güvenlik Uyarısı: Derin bağlantılar üzerinden gelen verileri asla doğrudan veritabanı sorgularında veya kritik API işlemlerinde "temizlemeden" kullanmayın. Gelen parametreleri her zaman tip kontrolünden geçirin ve XSS (Cross-Site Scripting) saldırılarına karşı veriyi valide edin.

Bağlantıların çalışıp çalışmadığını test etmek için terminal üzerinden şu komutları kullanabilirsiniz:

# Android için test komutu
adb shell am start -W -a android.intent.action.VIEW -d "https://uygulamaniz.com/urun/123"

# iOS için test komutu
xcrun simctl openurl booted "https://uygulamaniz.com/urun/123"

Bu komutlar, işletim sistemi seviyesinde uygulamanızın bağlantıyı doğru şekilde karşılayıp karşılamadığını simüle eder.

Sıkça Sorulan Sorular

Uygulamam neden bağlantıyı açmıyor?

En yaygın sebep, web sitenizdeki assetlinks.json veya apple-app-site-association dosyalarının yanlış yapılandırılmasıdır. Dosyaların HTTPS üzerinden erişilebilir ve doğru JSON formatında olduğundan emin olun.

Uygulama yüklü değilse ne olur?

Universal Links ve App Links kullanıyorsanız, kullanıcı otomatik olarak web sitenizdeki ilgili sayfaya yönlendirilir. Custom Scheme kullanıyorsanız, kullanıcı genellikle bir hata ile karşılaşır.

Firebase Dynamic Links hala kullanılıyor mu?

Google, Firebase Dynamic Links servisini kullanımdan kaldırmıştır. 2026 itibarıyla kendi sunucunuz üzerinden yönlendirme (Redirect) veya doğrudan derin bağlantı (Deep Link) yöntemlerini kullanmanız önerilir.

Aynı anda birden fazla domain tanımlayabilir miyim?

Evet, her iki platformda da birden fazla domaini "Associated Domains" listesine ekleyerek uygulamanızın farklı domainleri yönetmesini sağlayabilirsiniz.

Bağlantıdan gelen veriyi nasıl loglarım?

Bağlantıyı yakaladığınız noktada (örneğin GoRouter içinde), gelen URI'yi bir analitik servisine veya yerel log dosyasına kaydederek kullanıcıların hangi kanallardan geldiğini takip edebilirsiniz.

İleri Seviye Senaryo: Dinamik İçerik Yönlendirme ve State Yönetimi

Derin bağlantıları sadece bir sayfayı açmak için değil, aynı zamanda kullanıcı deneyimini kişiselleştirmek için de kullanabilirsiniz. Örneğin, bir e-ticaret uygulamasında kullanıcıya gönderilen "Sepetini Tamamla" bağlantısı, uygulama açıldığında doğrudan ödeme ekranına gitmeli ve sepetteki ürünleri otomatik olarak yüklemelidir. Bu süreci yönetirken go_router'ın redirect özelliğini kullanmak en temiz yaklaşımdır.


// GoRouter yapılandırması içerisinde dinamik yönlendirme
final GoRouter _router = GoRouter(
  routes: [
    GoRoute(
      path: '/checkout',
      builder: (context, state) => CheckoutScreen(
        cartId: state.uri.queryParameters['cart_id'],
      ),
    ),
  ],
  redirect: (context, state) {
    final bool loggedIn = AuthService.instance.isLoggedIn;
    final bool isCheckout = state.uri.path == '/checkout';
    
    if (!loggedIn && isCheckout) {
      return '/login?redirect=${state.uri.path}';
    }
    return null;
  },
);

Derin Bağlantı Performansını Optimize Etme

Uygulamanızın açılış hızını (Time to Interactive) korumak için derin bağlantı verilerini işlerken ana iş parçacığını (main thread) bloke etmemeniz gerekir. Özellikle bağlantı üzerinden gelen veritabanı sorguları veya API istekleri için aşağıdaki stratejileri izleyebilirsiniz:

  • Lazy Loading: Bağlantı ile gelen parametreleri hemen kullanmak yerine, ilgili ekranın initState aşamasında asenkron olarak yükleyin.
  • Cache Mekanizması: Bağlantıdan gelen verileri SharedPreferences veya Hive gibi yerel depolama birimlerine kaydederek, ağ bağlantısı olmadığında bile kullanıcıya eski veriyi gösterebilirsiniz.
  • Debouncing: Kullanıcı aynı bağlantıya çok hızlı tıklarsa, mükerrer yönlendirmeleri engellemek için bir kontrol mekanizması kurun.

Aşağıdaki kod bloğu, bağlantıdan gelen verinin işlenmesi sırasında kullanıcıya bir yükleme durumu göstermek için nasıl bir yapı kurulabileceğini gösterir:


class DeepLinkHandler extends StatefulWidget {
  final String? initialLink;
  const DeepLinkHandler({super.key, this.initialLink});

  @override
  State createState() => _DeepLinkHandlerState();
}

class _DeepLinkHandlerState extends State {
  bool _isLoading = true;

  @override
  void initState() {
    super.initState();
    _processLink();
  }

  Future _processLink() async {
    if (widget.initialLink != null) {
      // Veriyi işleme süreci
      await Future.delayed(const Duration(milliseconds: 500));
    }
    setState(() => _isLoading = false);
  }

  @override
  Widget build(BuildContext context) {
    return _isLoading 
      ? const CircularProgressIndicator() 
      : const MainScreen();
  }
}

Üretim Ortamında Test ve Dağıtım Stratejileri

Derin bağlantıların üretim ortamında (production) düzgün çalışması için sadece kodun doğruluğu yetmez; sunucu tarafındaki assetlinks.json (Android) ve apple-app-site-association (iOS) dosyalarının erişilebilirliği kritiktir. Dağıtım öncesi şu kontrol listesini uygulayın:

  1. SSL Sertifikası: Her iki dosyanın da HTTPS üzerinden, hiçbir yönlendirme (redirect) olmadan doğrudan erişilebilir olduğundan emin olun.
  2. MIME Tipi: Sunucunuzun bu dosyaları application/json içerik tipiyle sunduğunu doğrulayın.
  3. Google Digital Asset Links API: Android için Google'ın test aracını kullanarak yapılandırmanızın doğruluğunu onaylayın.
  4. Apple AASA Validator: iOS için Apple'ın doğrulama aracını kullanarak domain eşleşmesini test edin.

Sonuç

Flutter & mobil ile derin bağlantı yönetimi, kullanıcıyı doğru içeriğe en hızlı şekilde ulaştırmanın anahtarıdır. Bu rehberde, Android ve iOS için gerekli yapılandırmaları yaptınız ve Flutter tarafında go_router ile bu bağlantıları nasıl yöneteceğinizi öğrendiniz. Bir sonraki adım olarak, uygulamanıza "Deferred Deep Linking" (kullanıcı uygulamayı ilk kez yüklediğinde bağlantıyı hatırlama) özelliklerini eklemek için Branch.io gibi üçüncü parti servisleri inceleyebilirsiniz.

Not: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka kapsamlı bir güvenlik testinden geçirin ve sunucu tarafındaki doğrulama dosyalarınızın güncelliğini düzenli olarak kontrol edin.

Bu yazıya tepkinizi paylaşın:
Mert Özdemir

Teknoloji ve dijital dünyadaki karmaşık süreçleri adım adım rehberlerle sadeleştiriyorum. Kullanıcıların dijital araçlardan en yüksek verimi alması için anlaşılır ve öğretici içerikler yazıyorum.

Yorumlar (0)

Yorum Yaz