Menerima Dynamic Link di iOS

Untuk menerima Firebase Dynamic Links yang Anda buat, Anda harus menyertakan Dynamic Links SDK dalam aplikasi dan memanggil metode handleUniversalLink: dan dynamicLinkFromCustomSchemeURL: saat aplikasi tersebut dimuat, agar data diteruskan dalam Dynamic Link.

Prasyarat

Sebelum memulai, pastikan untuk menambahkan Firebase ke project iOS Anda.

Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.

  1. Di Xcode, dengan project aplikasi Anda dalam keadaan terbuka, buka File > Add Packages.
  2. Saat diminta, tambahkan repositori SDK platform Apple Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Pilih library Dynamic Links.
  5. Tambahkan flag -ObjC ke bagian Other Linker Flags pada setelan build target Anda.
  6. Untuk mengoptimalkan penggunaan Dynamic Links, sebaiknya aktifkan Google Analytics di project Firebase dan tambahkan Firebase SDK untuk Google Analytics ke aplikasi Anda. Anda dapat memilih library tanpa atau dengan pengumpulan IDFA.
  7. Setelah selesai, Xcode akan otomatis mulai me-resolve dan mendownload dependensi Anda di latar belakang.

Selanjutnya, lakukan beberapa langkah konfigurasi:

  1. Di Firebase console, buka bagian Dynamic Links. Setujui persyaratan layanan jika diminta.
  2. Pastikan ID App Store dan awalan ID Aplikasi untuk aplikasi Anda sudah ditentukan di setelan aplikasi. Untuk melihat dan mengedit setelan aplikasi, buka halaman Settings project Firebase, lalu pilih aplikasi iOS Anda.

    Konfirmasikan bahwa project Firebase Anda sudah dikonfigurasi dengan tepat untuk menggunakan Dynamic Links di aplikasi iOS, dengan membuka URL berikut:

    https://your_dynamic_links_domain/apple-app-site-association

    Jika aplikasi Anda sudah terhubung, file apple-app-site-association berisi referensi ke awalan ID Aplikasi dan ID paket aplikasi Anda. Contoh:

    {"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["NOT /_/*","/*"]}]}}

    Jika kolom details kosong, pastikan Anda sudah menentukan awalan ID Aplikasi. Perlu diperhatikan bahwa awalan ID Aplikasi mungkin tidak sama dengan ID Tim Anda.

  3. Opsional: Nonaktifkan penggunaan pasteboard iOS oleh Dynamic Links SDK.

    Secara default, Dynamic Links SDK menggunakan pasteboard untuk meningkatkan keandalan deep link setelah penginstalan. Dengan menggunakan pasteboard, Dynamic Links dapat memastikan bahwa saat pengguna membuka Dynamic Link tetapi perlu menginstal aplikasi Anda terlebih dahulu, pengguna dapat langsung membuka konten asli yang tertaut saat membuka aplikasi untuk pertama kali setelah penginstalan.

    Kekurangannya adalah penggunaan pasteboard memicu notifikasi pada iOS 14 dan versi yang lebih baru. Jadi, saat pengguna membuka aplikasi Anda untuk pertama kalinya, jika pasteboard berisi URL, mereka akan melihat notifikasi bahwa aplikasi Anda telah mengakses pasteboard, yang dapat menyebabkan kebingungan.

    Untuk menonaktifkan perilaku ini, edit file Info.plist pada project Xcode Anda dan setel kunci FirebaseDeepLinkPasteboardRetrievalEnabled ke NO.

  1. Di tab Info pada project Xcode aplikasi Anda, buat jenis URL baru yang akan digunakan untuk Dynamic Links. Tetapkan kolom Identifier ke nilai yang unik dan kolom URL scheme ke ID paket, yang merupakan skema URL default yang digunakan oleh Dynamic Links.
  2. Di tab Capabilities pada project Xcode aplikasi Anda, aktifkan Associated Domains lalu tambahkan hal berikut ini ke daftar Associated Domains:
    applinks:your_dynamic_links_domain
  3. Jika ingin menerima Dynamic Links dengan domain yang sepenuhnya kustom, di file Info.plist project Xcode Anda, buat kunci dengan nama FirebaseDynamicLinksCustomDomains, lalu tetapkan ke awalan URL Dynamic Links aplikasi Anda. Contoh:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. Impor modul FirebaseCore dalam UIApplicationDelegate Anda, serta semua modul Firebase lainnya yang digunakan oleh delegasi aplikasi Anda. Misalnya, untuk menggunakan Cloud Firestore dan Authentication:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. Konfigurasikan instance bersama FirebaseApp di metode application(_:didFinishLaunchingWithOptions:) delegasi aplikasi Anda:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. Jika menggunakan SwiftUI, Anda harus membuat delegasi aplikasi dan menambahkannya ke struct App melalui UIApplicationDelegateAdaptor atau NSApplicationDelegateAdaptor. Anda juga harus menonaktifkan swizzling delegasi aplikasi. Untuk mengetahui informasi lebih lanjut, baca petunjuk SwiftUI.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  7. Selanjutnya, pada metode application:continueUserActivity:restorationHandler: , tangani link yang diterima sebagai Universal Link saat aplikasi sudah diinstal:

    Swift

    Catatan: Produk ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
    func application(_ application: UIApplication, continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
      let handled = DynamicLinks.dynamicLinks()
        .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in
          // ...
        }
    
      return handled
    }

    Objective-C

    Catatan: Produk ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
    - (BOOL)application:(UIApplication *)application
    continueUserActivity:(nonnull NSUserActivity *)userActivity
     restorationHandler:
    #if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0)
    (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler {
    #else
        (nonnull void (^)(NSArray *_Nullable))restorationHandler {
    #endif  // __IPHONE_12_0
      BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
                                                              completion:^(FIRDynamicLink * _Nullable dynamicLink,
                                                                           NSError * _Nullable error) {
                                                                // ...
                                                              }];
      return handled;
    }
  8. Terakhir, di application:openURL:options: tangani link yang diterima melalui skema URL kustom aplikasi Anda. Metode ini dipanggil ketika aplikasi dibuka untuk pertama kalinya setelah diinstal.

    Jika Dynamic Link tidak ditemukan saat peluncuran pertama aplikasi Anda, metode ini akan dipanggil dengan url DynamicLink ditetapkan ke nil, yang menunjukkan bahwa SDK tidak dapat menemukan Dynamic Link tertunda yang cocok.

    Swift

    Catatan: Produk ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
    @available(iOS 9.0, *)
    func application(_ app: UIApplication, open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
      return application(app, open: url,
                         sourceApplication: options[UIApplication.OpenURLOptionsKey
                           .sourceApplication] as? String,
                         annotation: "")
    }
    
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
                     annotation: Any) -> Bool {
      if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
        // Handle the deep link. For example, show the deep-linked content or
        // apply a promotional offer to the user's account.
        // ...
        return true
      }
      return false
    }

    Objective-C

    Catatan: Produk ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
    - (BOOL)application:(UIApplication *)app
                openURL:(NSURL *)url
                options:(NSDictionary<NSString *, id> *)options {
      return [self application:app
                       openURL:url
             sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                    annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    }
    
    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
      FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
    
      if (dynamicLink) {
        if (dynamicLink.url) {
          // Handle the deep link. For example, show the deep-linked content,
          // apply a promotional offer to the user's account or show customized onboarding view.
          // ...
        } else {
          // Dynamic link has empty deep link. This situation will happens if
          // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link,
          // but pending link is not available for this device/App combination.
          // At this point you may display default onboarding view.
        }
        return YES;
      }
      return NO;
    }