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

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

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

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

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

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

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

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

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

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

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

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

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

  3. ทางเลือก : ปิดใช้งานการใช้พาสบอร์ด iOS ของ Dynamic Links SDK

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

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

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

  1. ในแท็บ ข้อมูล ของโปรเจ็กต์ Xcode ของแอปของคุณ ให้สร้างประเภท URL ใหม่ที่จะใช้สำหรับลิงก์แบบไดนามิก ตั้งค่า ฟิลด์ Identifier เป็นค่าที่ไม่ซ้ำใคร และฟิลด์ Scheme URL ให้เป็นตัวระบุบันเดิลของคุณ ซึ่งเป็น Scheme URL เริ่มต้นที่ใช้โดย Dynamic Links
  2. ในแท็บ ความสามารถ ของโปรเจ็กต์ 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 คุณต้องปิดใช้งานการสลับตัวแทนของแอปด้วย สำหรับข้อมูลเพิ่มเติม โปรดดู คำแนะนำ 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: จัดการลิงก์ที่ได้รับผ่าน Scheme 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;
    }