URL Scheme — mobil uygulamanın işletim sisteminde kaydettiği, myapp://path gibi bağlantılar üzerinden açılmak için kullanılan özel bir URI protokolüdür. RFC 3986'ya göre, URI şeması adresin sonraki tüm bileşenlerinin sözdizimini ve anlamını tanımlar. Böyle bir bağlantıya gidildiğinde, sistem benzersiz tanımlayıcısına göre kayıtlı uygulamayı tanımlar ve bağlantıdan çıkarılan parametrelerle uygulamayı başlatır. URL Scheme tabanlı Derin bağlantı, daha modern alternatiflerin ortaya çıkmasına rağmen mobil platformlarda uygulamalar arası navigasyonun temel mekanizması olarak kalmaktadır.
Önemli Noktalar
URL Scheme — bir uygulamanın özel bağlantılar üzerinden çağrı almak için işletim sistemine kaydettiği benzersiz bir protokol tanımlayıcısıdır. Kullanıcı myapp://profile/123 gibi bir bağlantıya tıkladığında, sistem myapp şemasını kaydeden uygulamayı tanımlar ve tam URI ile kontrolü ona devreder. Bu mekanizma, uygulamaların sunucu altyapısı gerektirmeden veri alışverişi yapmasına ve birbirlerini açmasına olanak tanır.
URL Scheme kavramı doğrudan web standartları RFC 3986'dan alınmıştır; burada URI şeması, herhangi bir evrensel kaynak tanımlayıcısının ilk bileşenidir. Mobil geliştirmede bu fikir, uygulamalar arası iletişim için uyarlanmıştır; burada bir HTTP sunucusu yerine uygulamanın kendisi bağlantı işleyicisi olarak görev yapar.
Birçok popüler uygulama, üçüncü taraf hizmetlerle entegrasyon için kendi URL Scheme'lerini kaydeder. Örneğin, Spotify spotify:// şemasını kullanır, Telegram tg:// kullanır ve Instagram instagram:// kullanır. Geliştiriciler ayrıca dahili navigasyon ve uçtan uca ekran testleri için sık sık appname:// şeması oluşturur.
URL Scheme'ler, uygulamanın belirli bir bölümüne anında navigasyon gerektiren push bildirimlerinde, e-posta bültenlerinde ve QR kodlarında hala yaygın olarak kullanılmaktadır. Ancak iOS 9 ve Android 6'dan itibaren, basit şemaları kademeli olarak tamamlayan ve değiştiren alternatif mekanizmalar ortaya çıkmıştır.
Özel bir URI'nin yapısı genel RFC 3986 belirtimine uyar ve birkaç bileşenden oluşur. Şema önce belirtilir ve adresin geri kalanından iki nokta üst üste ile ayrılır. Şemadan sonra ana bilgisayar, bağlantı noktası, yol, sorgu parametreleri ve parça gelebilir ve bunların her biri isteğe bağlıdır.
Tam sözdizimi scheme://host/path?key=value#fragment şeklindedir. Şema tek zorunlu öğedir; geri kalanı belirli uygulamanın ihtiyaçlarına göre belirlenir. Şemadan sonraki çift eğik çizgi tarihsel olarak HTTP'den alınmıştır ve belirtime göre kesinlikle zorunlu değildir, ancak evrensel olarak bir kural olarak kullanılır.
URI yapısının görsel bir temsili için bir bileşen tablosu kullanılır. Her öğenin kendi amacı ve zorunluluk düzeyi vardır.
| Bileşen | Örnek | Zorunlu |
|---|---|---|
| Scheme | myapp | Evet |
| Host | profile | Hayır |
| Path | /user/42 | Hayır |
| Query | ?id=42&tab=main | Hayır |
| Fragment | #section2 | Hayır |
Geliştiriciler URI yapısını keyfi olarak seçebilir, bu esneklik sağlar ancak uygulamanın farklı sürümleri arasında uyumluluk sorunları yaratır. URL Scheme biçiminin uygulamanın genel API'sinin bir parçası olarak belgelenmesi ve değişikliklerde sürümlenmesi önerilir.
iOS, projenin Info.plist dosyasında her URL Scheme'in açıkça kaydedilmesini gerektirir. Geliştirici, her öğesi bir tanımlayıcı (CFBundleURLName) ve desteklenen şemaların (CFBundleURLSchemes) bir listesini içeren bir CFBundleURLTypes dizisi ekler. Kayıttan sonra sistem, kayıtlı şemalardaki tüm gelen çağrıları otomatik olarak uygulamaya yönlendirir.
Gelen bir URL Scheme'in işlenmesi, uygulama temsilcisinde application(_:open:options:) yöntemi aracılığıyla gerçekleşir. Bu yöntem, navigasyon kararları almak için yol ve sorgu parametrelerinin çıkarıldığı bir URL nesnesi alır. İşleyici, işlemin başarısını belirten bir Bool değeri döndürmelidir.
Aşağıda Swift dilinde bir URL Scheme işleyicisinin örnek bir uygulaması verilmiştir. Kod, URLComponents kullanarak gelen bir URI'den ana bilgisayar ve sorgu parametrelerinin çıkarılmasını göstermektedir.
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any]
) -> Bool {
let host = url.host
let params = URLComponents(
url: url,
resolvingAgainstBaseURL: false
)?.queryItems
if host == "profile" {
navigateToProfile(params)
}
return true
}
Yöntem, sorgu parametrelerinin güvenli bir şekilde ayrıştırılması için URLComponents kullanır. Bu yaklaşım, parametre değerlerindeki yüzde kodlamayı ve özel karakterlerin kod çözümünü otomatik olarak işlediği için manuel dize ayrıştırmasına tercih edilir.
Android, URL Scheme tabanlı derin bağlantıları yönlendirmek için Intent Filter sistemini kullanır. Geliştirici, bağlantıyı işlemesi gereken Activity etiketi içinde AndroidManifest.xml'de bir filtre bildirir. Filtre, VIEW eylemini, BROWSABLE ve DEFAULT kategorilerini ve şemayı, ana bilgisayarı ve pathPrefix'i belirten bir data etiketi içerir.
Kullanıcı özel bir şemaya sahip bir bağlantıya tıkladığında, sistem yüklü tüm uygulamaların Intent Filter'ını kontrol eder. Birden fazla eşleşen uygulama bulunursa, kullanıcıya bir seçim iletişim kutusu sunulur. BROWSABLE kategorisi, bağlantının tarayıcıdan işlenmesine izin verir.
Bir Activity'de myapp şemasını işlemek için AndroidManifest.xml'de Intent Filter bildirimi örneği. Doğru derin bağlantı yönlendirmesi için action ve category kombinasyonu zorunludur.
<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="myapp"
android:host="profile"
android:pathPrefix="/user" />
</intent-filter>
</activity>
Activity'de filtreyi yapılandırdıktan sonra, URI'yi almak için intent.getData() çağrılmalıdır. Intent ve verilerin null olup olmadığını kontrol etmek önemlidir, çünkü Activity gelen bir derin bağlantı olmadan başlatılabilir, örneğin başlatıcıdan standart başlatma sırasında.
URL Scheme'de sorgu parametreleri, soru işaretinden sonra anahtar=değer biçiminde, ve işaretiyle ayrılarak iletilir. Bu biçim HTTP istekleriyle aynıdır ve platformun standart araçları tarafından kolayca işlenir. İzin verilen URI karakter kümesinde olmayan tüm karakterler için yüzde kodlaması kullanılarak parametreler kodlanmalıdır.
Parametreli tam bağlantı örneği: myapp://profile?userId=42&source=email&ref=abc123. URL çıkarıldıktan sonra, uygulama tüm sorgu öğelerini sırayla ayrıştırır ve değerlerine göre hedef ekrana navigasyon kararı alır.
Karmaşık veriler aktarılırken URI uzunluk sınırını dikkate almak önemlidir. iOS'ta maksimum URL Scheme uzunluğu 2 KB ile sınırlıdır, bundan sonra sistem bağlantıyı keser. Android'de sınır yaklaşık 8 KB'dir, ancak kesin değer işletim sistemi sürümüne ve cihaz üreticisine bağlıdır. Büyük miktarda veri için, URL Scheme aracılığıyla yalnızca bir oturum tanımlayıcısı iletilmesi ve kalan verilerin sunucudan yüklenmesi önerilir.
URL Scheme'in ana dezavantajı, uygulama cihazda yüklü değilse bir bağlantıyı işleyememesidir. Tarayıcı bir hata gösterir ve kullanıcı navigasyon bağlamını kaybeder. Bu sorunu çözmek için Apple iOS 9'da Universal Links'i ve Google Android 6'da App Links'i tanıttı. Her iki mekanizma da uygulamayla ilişkili bir web alanı aracılığıyla kaydedilir.
Universal Links ve App Links normal HTTPS bağlantıları gibi çalışır, ancak uygulama yüklü olduğunda seçim iletişim kutusu olmadan uygulamayı açar. Uygulama yüklü değilse, bağlantı aynı alandaki bir web sayfasını açarak kullanıcı deneyimini korur. Bu, onları üretim ortamları için tercih edilen alternatif haline getirir.
iOS ve Android'de URL Scheme için yerleşik bir geri dönüş mekanizması yoktur. Geliştiriciler ara sunucu çözümleri kullanır: bağlantı, JavaScript aracılığıyla uygulamanın yüklü olup olmadığını kontrol eden ve şemaya veya uygulama mağazasına yönlendiren bir web sayfasına gider. Firebase Dynamic Links ve Branch.io, özel bir sunucu hattı geliştirmeye gerek kalmadan yükleme durumunu otomatik olarak belirleyen ve kullanıcıyı yönlendiren ertelenmiş derin bağlantı desteğiyle bu soruna hazır çözümler sunar.
iOS 15+ ve Android 12+ üzerinde URL Scheme kullanırken, gizlilik kurallarının sıkılaştırıldığı ek karmaşıklık ortaya çıkar. Safari, önceden onay almadan kayıtlı olmayan bir şemayı açma girişimlerini engeller ve Android 12, PackageManager aracılığıyla yüklü uygulamaların görünürlüğünü kısıtlar. Bu değişiklikler, uygulamalar arası iletişim için URL Scheme kullanımını önceki platform sürümlerine göre daha az güvenilir hale getirir.
Sıkça Sorulan Sorular
URL Scheme şifrelemesiz özel bir protokol kullanırken, Universal Links alan doğrulaması ile HTTPS üzerinden çalışır. Universal Links, uygulama seçim iletişim kutusunu tetiklemez ve uygulama cihazda yüklü olmasa bile doğru şekilde işlenir.
Evet, ancak ASCII olmayan tüm karakterler RFC 3986'ya göre yüzde kodlaması kullanılarak kodlanmalıdır. Eski işletim sistemi sürümleri ve tarayıcılarla uyumluluğu sağlamak için URL Scheme'de Kiril kullanmaktan kaçınılması önerilir.
Ne iOS'ta ne de Android'de şema sayısında bir sınır yoktur. Pratikte, uygulamalar bir ila beş şema kullanır. Örneğin, Telegram tg://, t.me/, telegram:// ve telegram.me:// şemalarını kaydeder.
iOS'ta canOpenURL(_:) yöntemi kullanılır, şema kayıtlıysa true döndürür. Android'de kontrol PackageManager.queryIntentActivities() aracılığıyla yapılır. Her iki platform da yapılandırmada şemanın önceden belirtilmesini gerektirir.
Hayır, URL Scheme verileri şifrelemez. Aynı şemayı kaydeden herhangi bir uygulama bağlantıyı ele geçirebilir. Güvenlik için, HTTPS ile Universal Links veya protokol düzeyinde uçtan uca şifreleme kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun