Swift ile Deep linking nasıl yapılır?

yusuf demirkoparan
4 min readMar 20, 2020

--

Deep link nedir?

Deep link bir URL aracılığı ile uygulamayı tetiklemektir. Tıklanılan URL’e göre açılacak sayfanın belirlenmesi gibi kullanıcı deneyimini üst seviyeye çıkaracak bir özellik de denilebilir.

Deep link’e ne zaman ihtiyaç duyarız?

Bu kısmı senaryo üzerinden anlatmak istiyorum:

Örneğin bir uygulamamız var ve şifremi unuttum özelliğine sahip. Şifremi unuttuma tıkladık, kayıtlı mail’imize bir link geldi. İşte o linke tıklandığında uygulamada şifre değiştirme ekranının doğrudan açılmasını istiyoruz. Bu linke tıklandığında uygulamanın şifre değiştirme ekranını açmasında Deep link’e ihtiyaç duyuyoruz!

Swift’te Deep link ekleme yöntemleri nelerdir?

  • Universal Link
  • URL Scheme

Universal Link
Apple’ın işletim sistemlerinde, uygulamaları web görünümü olarak da bilinen bir web sitesinden başlatma yoludur. Bir uygulama veya web sitesindeki içeriğe bağlanır ve iOS kullanıcılarına entegre bir mobil deneyim sunar.

URL Scheme
Universal Link ile aynı amaçta olmakla beraber sunucuya ve ssl ihtiyacı duymadan, ayrıca Universal Link’e göre kurulumu daha basit olduğu belirtilmektedir. URL Scheme Swift’te ilk Deep Link türüdür.

Universal Link vs URL Scheme

Universal Link

  • Erişim izini isteği istemez
  • Tanımlı URL browser ile açılmaz
  • Bütün platformları destekler
  • Uygulama yüklü değilse yedek URL kullanılır
  • SSL zorunludur
  • Kurulumu URL Scheme’ye göre daha complextir

URL Scheme

  • Kurulumu Universal Linke göre daha basittir
  • SSL zorunluluğu yoktur
  • Erişim izni ister
  • Diğer platformları desteklemez
  • Uygulama yüklü değilse çalışmaz

Bu yazıda Deep link’in ve Swift’te Universal Link’in nasıl oluşturulacağını göstereceğiz.

Deep link logic

Deep linki Nasıl Oluşturabiliriz?

Öcelikle enroll edilmiş bir developer hesabına sahip olmalısınız.

Adım adım göstereceğim:

Apple Developer Account’ta var olan Profile’inizin Identifiers sekmesine geliyoruz ve Universal Link eklemek istediğimiz Identifier’i seçiyoruz. Associated Domains’i On yapıyoruz ve Profile güncelleyip indirdikten sonra tekrar projemize import ediyoruz.

Profile’i güncelledikten sonra Xcode üzerinden Associated Domains’i tanımlamamız gerekiyor.

Profile’i güncelledikten sonra Domains kısmına uygulamamızı bir URL’e bastığımızda tetikleyecek domain isimlerini yazıyoruz. Eklerken domain adının başına applinks: koyuyoruz. (applink:domainName.com)

Client tarafında Deep link kurulumunu tamamladık. Artık, URL’e tıklandığında uygulama açıldıktan sonra hangi ekranda açılmasını istiyorsak aşağıdaki AppDelegate’te handle etmemiz kalıyor.

iOS 13 altı için:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {guard let url = userActivity.webpageURL else { return false }if url.lastPathComponent == "changePassword" {let rootViewController = UINavigationController(rootViewController: UIViewController())window?.rootViewController = rootViewControllerwindow?.makeKeyAndVisible()}return true}

iOS 13 üzeri için:

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard let url = userActivity.webpageURL else { return false }
if url.lastPathComponent == "changePassword" {let rootViewController = UINavigationController(rootViewController: UIViewController())window?.rootViewController = rootViewControllerwindow?.makeKeyAndVisible()}}

Mobil tarafında kurulumu tamamladık.

Peki domain tarafında neler yapmamız gerekiyor?

Domain tarafında URL’e tıklandığında eşleşmesini sağlayacak bir JSON eklememiz gerekiyor. Oluşturduğumuz JSON’u websitenin yer aldığı sunucunun ana dizinine atılması gerekmektedir. Bu JSON içerisinde Apple Team ID ve Bundle ID tanımlamamız gerekiyor; böylece oluşturduğumuz Deep Link’in uygulamada tıklanan URL ile eşleşmesini ve uygulamamızı tetiklemesini sağlayacağız.

Team ID’nizi buradan alabilirsiniz.

Terminal üzerinden herhangi bir dizinde aşağıdaki kodu yapıştırarak dosyamızı oluşturuyoruz:

touch apple-app-site-association

Oluşturalan dosyanın içerisine aşağıda paylaştığım JSON’u ekleyip o projeye ait kullanılan hesabın Team ID’si ve Bundle ID ekliyoruz.

{
"applinks": {
"apps": [],
"details": [
{
"appID": "TeamID.BundleID",
"paths": ["/changePassword/*"]
}
]
}
}

Yukarıda tanımlanan path bizim keyword’ümüz diyebiliriz, yani kullanıcı bir URL’e tıkladığında biz bu keyword’ü AppDelegate’te ele aldıysak uygulamaya başla demiş oluyoruz. Sonunda * olması demek bütün pathleri tetiklemesi anlamına gelmektedir.

Oluşturduğumuz JSON’u websitenin yer aldığı sunucunun ana dizinine attıktan sonra beklediğimiz çıktısı aşağıdaki paylaştığım örnekler gibi olmalıdır:

https://www.reddit.com/apple-app-site-association

https://facebook.com/apple-app-site-association

Oluşturduğumuz dosyayı websitenin ana dizinine attıktan sonra Deep Link’in başarılı bir şekilde kurulduğunu kontrol etmeniz için aşağıdaki linkteki ilgili alanları doldurarak test edebilirsiniz:

Referanslar:

https://developer.apple.com/ios/universal-links/

https://www.adjust.com/blog/universal-links-vs-deep-links/

https://medium.com/wolox/ios-deep-linking-url-scheme-vs-universal-links-50abd3802f97

--

--