Ö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
initStateaşamasında asenkron olarak yükleyin. - Cache Mekanizması: Bağlantıdan gelen verileri
SharedPreferencesveyaHivegibi 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:
- SSL Sertifikası: Her iki dosyanın da HTTPS üzerinden, hiçbir yönlendirme (redirect) olmadan doğrudan erişilebilir olduğundan emin olun.
- MIME Tipi: Sunucunuzun bu dosyaları
application/jsoniçerik tipiyle sunduğunu doğrulayın. - Google Digital Asset Links API: Android için Google'ın test aracını kullanarak yapılandırmanızın doğruluğunu onaylayın.
- 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.


Yorumlar (0)
Yorum Yaz