Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

รับไดนามิกลิงก์บน iOS

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

ในการรับ Firebase Dynamic Links ที่ คุณสร้างขึ้น คุณต้องรวม Dynamic Links SDK ในแอปของคุณและเรียก handleUniversalLink: และ dynamicLinkFromCustomSchemeURL: เมื่อแอปของคุณโหลดเพื่อรับข้อมูลที่ส่งผ่านในลิงก์ไดนามิก

ข้อกำหนดเบื้องต้น

ก่อนที่คุณจะเริ่มต้น อย่าลืม เพิ่ม Firebase ในโครงการ iOS ของคุณ

ใช้ Swift Package Manager เพื่อติดตั้งและจัดการการอ้างอิง Firebase

  1. ใน Xcode เมื่อโปรเจ็กต์แอปของคุณเปิดอยู่ ให้ไปที่ File > Add Packages
  2. เมื่อได้รับแจ้ง ให้เพิ่มที่เก็บ Firebase Apple platforms SDK:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. เลือกไลบรารีลิงก์ไดนามิก
  5. เพื่อประสบการณ์ที่ดีที่สุดกับลิงก์แบบไดนามิก เราขอแนะนำให้ เปิดใช้ Google Analytics ในโครงการ Firebase และเพิ่ม Firebase SDK สำหรับ Google Analytics ลงในแอปของคุณ คุณสามารถเลือกห้องสมุดที่ไม่มีการรวบรวม IDFA หรือมีการรวบรวม IDFA
  6. เมื่อเสร็จแล้ว Xcode จะเริ่มแก้ไขและดาวน์โหลดการอ้างอิงของคุณโดยอัตโนมัติในเบื้องหลัง

ตอนนี้ ทำตามขั้นตอนการกำหนดค่าบางอย่าง:

  1. ใน คอนโซล Firebase ให้เปิดส่วน ลิงก์แบบไดนามิก ยอมรับข้อกำหนดในการให้บริการ หากคุณได้รับแจ้งให้ดำเนินการดังกล่าว
  2. ตรวจสอบให้แน่ใจว่า App Store ID ของแอพและคำนำหน้า ID แอพของคุณระบุไว้ในการตั้งค่าแอพของคุณ หากต้องการดูและแก้ไขการตั้งค่าแอป ให้ไปที่ หน้าการตั้งค่า โปรเจ็กต์ Firebase แล้วเลือกแอป iOS

    คุณสามารถยืนยันได้ว่าโปรเจ็กต์ Firebase ได้รับการกำหนดค่าให้ใช้ลิงก์แบบไดนามิกในแอป iOS อย่างถูกต้องโดยการเปิด URL ต่อไปนี้:

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

    หากแอปของคุณเชื่อมต่ออยู่ ไฟล์ apple-app-site-association จะมีการอ้างอิงถึงคำนำหน้า App ID และ Bundle ID ของแอป ตัวอย่างเช่น:

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

    หากช่อง details ว่างเปล่า ให้ตรวจสอบอีกครั้งว่าคุณระบุคำนำหน้า ID แอปของคุณ โปรดทราบว่าคำนำหน้า App ID ของคุณอาจไม่เหมือนกับ Team ID ของคุณ

  3. ไม่บังคับ : ปิดใช้งานไดนามิกลิงก์ SDK ของ iOS เพสต์บอร์ด

    ตามค่าเริ่มต้น SDK ลิงก์แบบไดนามิกจะใช้เพสต์บอร์ดเพื่อปรับปรุงความน่าเชื่อถือของลิงก์ในรายละเอียดหลังการติดตั้ง เมื่อใช้เพสต์บอร์ด ไดนามิกลิงก์จะช่วยให้แน่ใจว่าเมื่อผู้ใช้เปิดไดนามิกลิงก์แต่จำเป็นต้องติดตั้งแอปของคุณก่อน ผู้ใช้สามารถไปยังเนื้อหาที่ลิงก์ดั้งเดิมได้ทันทีเมื่อเปิดแอปเป็นครั้งแรกหลังการติดตั้ง

    ข้อเสียคือการใช้เพสต์บอร์ดทริกเกอร์การแจ้งเตือนบน iOS 14 และใหม่กว่า ดังนั้น ในครั้งแรกที่ผู้ใช้เปิดแอปของคุณ หากเพสต์บอร์ดมี URL พวกเขาจะเห็นการแจ้งเตือนว่าแอปของคุณเข้าถึงเพสต์บอร์ด ซึ่งอาจทำให้เกิดความสับสนได้

    หากต้องการปิดใช้งานลักษณะการทำงานนี้ ให้แก้ไขไฟล์ Info.plist ของโปรเจ็กต์ Xcode และตั้งค่าคีย์ FirebaseDeepLinkPasteboardRetrievalEnabled เป็น NO

  1. ในแท็บ ข้อมูล ของโครงการ Xcode ของแอป ให้สร้างประเภท URL ใหม่เพื่อใช้สำหรับลิงก์แบบไดนามิก ตั้งค่าฟิลด์ Identifier เป็นค่าที่ไม่ซ้ำ และฟิลด์ Scheme URL เป็นตัวระบุบันเดิลของคุณ ซึ่งเป็น Scheme URL เริ่มต้นที่ใช้โดย Dynamic Links
  2. ในแท็บ Capabilities ของโครงการ Xcode ของแอป ให้เปิดใช้งาน Associated Domains และเพิ่มสิ่งต่อไปนี้ลงในรายการ Associated Domains :
    applinks:your_dynamic_links_domain
  3. หากคุณต้องการรับลิงก์แบบไดนามิกที่มี โดเมนที่กำหนดเอง ทั้งหมด ในไฟล์ Info.plist ของโปรเจ็กต์ Xcode ให้สร้างคีย์ชื่อ FirebaseDynamicLinksCustomDomains และตั้งค่าเป็นคำนำหน้า URL ลิงก์แบบไดนามิกของแอป ตัวอย่างเช่น:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. นำเข้าโมดูล FirebaseCore ใน UIApplicationDelegate ของคุณ รวมถึง โมดูล Firebase อื่นๆ ที่ตัวแทนแอปของคุณใช้ ตัวอย่างเช่น หากต้องการใช้ Cloud Firestore และการรับรองความถูกต้อง:

    SwiftUI

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

    สวิฟต์

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    วัตถุประสงค์-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. กำหนดค่าอินสแตนซ์ที่ใช้ร่วมกันของ FirebaseApp ในแอปพลิเคชันผู้รับมอบสิทธิ์แอปของคุณ application(_:didFinishLaunchingWithOptions:) วิธีการ:

    SwiftUI

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

    สวิฟต์

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

    วัตถุประสงค์-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. หากคุณใช้ SwiftUI คุณต้องสร้างตัวแทนแอปพลิเคชันและแนบกับโครงสร้าง App ของคุณผ่าน UIApplicationDelegateAdaptor หรือ NSApplicationDelegateAdaptor คุณต้องปิดใช้งานการ swizzling ของผู้รับมอบสิทธิ์แอปด้วย สำหรับข้อมูลเพิ่มเติม โปรดดู คำแนะนำ 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. ถัดไป ในเมธอด application:continueUserActivity:restorationHandler: ให้จัดการลิงก์ที่ได้รับเป็น Universal Links เมื่อติดตั้งแอปแล้ว:

    สวิฟต์

    หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานบนเป้าหมาย macOS, Mac Catalyst, tvOS หรือ 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
    }
    

    วัตถุประสงค์-C

    หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานบนเป้าหมาย macOS, Mac Catalyst, tvOS หรือ 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. สุดท้าย ใน application:openURL:options: จัดการลิงก์ที่ได้รับผ่านรูปแบบ URL ที่กำหนดเองของแอป วิธีนี้เรียกว่าเมื่อเปิดแอปของคุณเป็นครั้งแรกหลังการติดตั้ง

    หากไม่พบลิงก์ไดนามิกในการเปิดใช้งานแอปของคุณครั้งแรก วิธีการนี้จะถูกเรียกโดยตั้งค่า url ของ DynamicLink เป็น nil ซึ่งบ่งชี้ว่า SDK ไม่พบลิงก์ไดนามิกที่ตรงกันที่รอดำเนินการ

    สวิฟต์

    หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานบนเป้าหมาย macOS, Mac Catalyst, tvOS หรือ 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
    }
    

    วัตถุประสงค์-C

    หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานบนเป้าหมาย macOS, Mac Catalyst, tvOS หรือ 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;
    }
,

ในการรับ Firebase Dynamic Links ที่ คุณสร้างขึ้น คุณต้องรวม Dynamic Links SDK ในแอปของคุณและเรียก handleUniversalLink: และ dynamicLinkFromCustomSchemeURL: เมื่อแอปของคุณโหลดเพื่อรับข้อมูลที่ส่งผ่านในลิงก์ไดนามิก

ข้อกำหนดเบื้องต้น

ก่อนที่คุณจะเริ่มต้น อย่าลืม เพิ่ม Firebase ในโครงการ iOS ของคุณ

ใช้ Swift Package Manager เพื่อติดตั้งและจัดการการอ้างอิง Firebase

  1. ใน Xcode เมื่อโปรเจ็กต์แอปของคุณเปิดอยู่ ให้ไปที่ File > Add Packages
  2. เมื่อได้รับแจ้ง ให้เพิ่มที่เก็บ Firebase Apple platforms SDK:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. เลือกไลบรารีลิงก์ไดนามิก
  5. เพื่อประสบการณ์ที่ดีที่สุดกับลิงก์แบบไดนามิก เราขอแนะนำให้ เปิดใช้ Google Analytics ในโครงการ Firebase และเพิ่ม Firebase SDK สำหรับ Google Analytics ลงในแอปของคุณ คุณสามารถเลือกห้องสมุดที่ไม่มีการรวบรวม IDFA หรือมีการรวบรวม IDFA
  6. เมื่อเสร็จแล้ว Xcode จะเริ่มแก้ไขและดาวน์โหลดการอ้างอิงของคุณโดยอัตโนมัติในเบื้องหลัง

ตอนนี้ ทำตามขั้นตอนการกำหนดค่าบางอย่าง:

  1. ใน คอนโซล Firebase ให้เปิดส่วน ลิงก์แบบไดนามิก ยอมรับข้อกำหนดในการให้บริการ หากคุณได้รับแจ้งให้ดำเนินการดังกล่าว
  2. ตรวจสอบให้แน่ใจว่า App Store ID ของแอพและคำนำหน้า ID แอพของคุณระบุไว้ในการตั้งค่าแอพของคุณ หากต้องการดูและแก้ไขการตั้งค่าแอป ให้ไปที่ หน้าการตั้งค่า โปรเจ็กต์ Firebase แล้วเลือกแอป iOS

    คุณสามารถยืนยันได้ว่าโปรเจ็กต์ Firebase ได้รับการกำหนดค่าให้ใช้ลิงก์แบบไดนามิกในแอป iOS อย่างถูกต้องโดยการเปิด URL ต่อไปนี้:

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

    หากแอปของคุณเชื่อมต่ออยู่ ไฟล์ apple-app-site-association จะมีการอ้างอิงถึงคำนำหน้า App ID และ Bundle ID ของแอป ตัวอย่างเช่น:

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

    หากช่อง details ว่างเปล่า ให้ตรวจสอบอีกครั้งว่าคุณระบุคำนำหน้า ID แอปของคุณ โปรดทราบว่าคำนำหน้า App ID ของคุณอาจไม่เหมือนกับ Team ID ของคุณ

  3. ไม่บังคับ : ปิดใช้งานไดนามิกลิงก์ SDK ของ iOS เพสต์บอร์ด

    ตามค่าเริ่มต้น SDK ลิงก์แบบไดนามิกจะใช้เพสต์บอร์ดเพื่อปรับปรุงความน่าเชื่อถือของลิงก์ในรายละเอียดหลังการติดตั้ง เมื่อใช้เพสต์บอร์ด ไดนามิกลิงก์จะช่วยให้แน่ใจว่าเมื่อผู้ใช้เปิดไดนามิกลิงก์แต่จำเป็นต้องติดตั้งแอปของคุณก่อน ผู้ใช้สามารถไปยังเนื้อหาที่ลิงก์ดั้งเดิมได้ทันทีเมื่อเปิดแอปเป็นครั้งแรกหลังการติดตั้ง

    ข้อเสียคือการใช้เพสต์บอร์ดทริกเกอร์การแจ้งเตือนบน iOS 14 และใหม่กว่า ดังนั้น ในครั้งแรกที่ผู้ใช้เปิดแอปของคุณ หากเพสต์บอร์ดมี URL พวกเขาจะเห็นการแจ้งเตือนว่าแอปของคุณเข้าถึงเพสต์บอร์ด ซึ่งอาจทำให้เกิดความสับสนได้

    หากต้องการปิดใช้งานลักษณะการทำงานนี้ ให้แก้ไขไฟล์ Info.plist ของโปรเจ็กต์ Xcode และตั้งค่าคีย์ FirebaseDeepLinkPasteboardRetrievalEnabled เป็น NO

  1. ในแท็บ ข้อมูล ของโครงการ Xcode ของแอป ให้สร้างประเภท URL ใหม่เพื่อใช้สำหรับลิงก์แบบไดนามิก ตั้งค่าฟิลด์ Identifier เป็นค่าที่ไม่ซ้ำ และฟิลด์ Scheme URL เป็นตัวระบุบันเดิลของคุณ ซึ่งเป็น Scheme URL เริ่มต้นที่ใช้โดย Dynamic Links
  2. ในแท็บ Capabilities ของโครงการ Xcode ของแอป ให้เปิดใช้งาน Associated Domains และเพิ่มสิ่งต่อไปนี้ลงในรายการ Associated Domains :
    applinks:your_dynamic_links_domain
  3. หากคุณต้องการรับลิงก์แบบไดนามิกที่มี โดเมนที่กำหนดเอง ทั้งหมด ในไฟล์ Info.plist ของโปรเจ็กต์ Xcode ให้สร้างคีย์ชื่อ FirebaseDynamicLinksCustomDomains และตั้งค่าเป็นคำนำหน้า URL ลิงก์แบบไดนามิกของแอป ตัวอย่างเช่น:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. นำเข้าโมดูล FirebaseCore ใน UIApplicationDelegate ของคุณ รวมถึง โมดูล Firebase อื่นๆ ที่ตัวแทนแอปของคุณใช้ ตัวอย่างเช่น หากต้องการใช้ Cloud Firestore และการรับรองความถูกต้อง:

    SwiftUI

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

    สวิฟต์

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    วัตถุประสงค์-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. กำหนดค่าอินสแตนซ์ที่ใช้ร่วมกันของ FirebaseApp ในแอปพลิเคชันผู้รับมอบสิทธิ์แอปของคุณ application(_:didFinishLaunchingWithOptions:) วิธีการ:

    SwiftUI

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

    สวิฟต์

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

    วัตถุประสงค์-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. หากคุณใช้ SwiftUI คุณต้องสร้างตัวแทนแอปพลิเคชันและแนบกับโครงสร้าง App ของคุณผ่าน UIApplicationDelegateAdaptor หรือ NSApplicationDelegateAdaptor คุณต้องปิดใช้งานการ swizzling ของผู้รับมอบสิทธิ์แอปด้วย สำหรับข้อมูลเพิ่มเติม โปรดดู คำแนะนำ 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. ถัดไป ในเมธอด application:continueUserActivity:restorationHandler: ให้จัดการลิงก์ที่ได้รับเป็น Universal Links เมื่อติดตั้งแอปแล้ว:

    สวิฟต์

    หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานบนเป้าหมาย macOS, Mac Catalyst, tvOS หรือ 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
    }
    

    วัตถุประสงค์-C

    หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานบนเป้าหมาย macOS, Mac Catalyst, tvOS หรือ 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. สุดท้าย ใน application:openURL:options: จัดการลิงก์ที่ได้รับผ่านรูปแบบ URL ที่กำหนดเองของแอป วิธีนี้เรียกว่าเมื่อเปิดแอปของคุณเป็นครั้งแรกหลังการติดตั้ง

    หากไม่พบลิงก์ไดนามิกในการเปิดใช้งานแอปของคุณครั้งแรก วิธีการนี้จะถูกเรียกโดยตั้งค่า url ของ DynamicLink เป็น nil ซึ่งบ่งชี้ว่า SDK ไม่พบลิงก์ไดนามิกที่ตรงกันที่รอดำเนินการ

    สวิฟต์

    หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานบนเป้าหมาย macOS, Mac Catalyst, tvOS หรือ 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
    }
    

    วัตถุประสงค์-C

    หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานบนเป้าหมาย macOS, Mac Catalyst, tvOS หรือ 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;
    }