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

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

สิ่งที่ต้องดำเนินการก่อน

ก่อนเริ่มต้น ให้ตรวจสอบว่าได้เพิ่ม Firebase ไปยังโปรเจ็กต์ iOS แล้ว

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

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

โดยทำตามขั้นตอนการกำหนดค่าต่อไปนี้

  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 Link SDK

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

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

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

  1. ในแท็บ Info ของโปรเจ็กต์ Xcode ของแอป ให้สร้างประเภท URL ใหม่เพื่อใช้กับลิงก์แบบไดนามิก ตั้งค่าช่องตัวระบุเป็นค่าที่ไม่ซ้ำกัน และช่องรูปแบบ URL เป็นตัวระบุกลุ่ม ซึ่งเป็นรูปแบบ URL เริ่มต้นที่ลิงก์แบบไดนามิกใช้
  2. ในแท็บ Capabilities ของโปรเจ็กต์ Xcode ของแอป ให้เปิดใช้โดเมนที่เกี่ยวข้องและเพิ่มรายการต่อไปนี้ลงในรายการโดเมนที่เชื่อมโยง
    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 และ 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. กำหนดค่าอินสแตนซ์ที่แชร์ของ FirebaseApp ในเมธอด application(_:didFinishLaunchingWithOptions:) ของตัวแทนแอป ดังนี้

    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. หากใช้ SwiftUI คุณต้องสร้างการมอบสิทธิ์แอปพลิเคชันและแนบการมอบสิทธิ์กับโครงสร้าง App ผ่าน UIApplicationDelegateAdaptor หรือ NSApplicationDelegateAdaptor คุณต้องปิดใช้ SWizzing ที่มอบสิทธิ์ของแอปด้วย ดูข้อมูลเพิ่มเติมได้ที่วิธีการของ 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 Link เมื่อติดตั้งแอปไว้แล้ว โดยทำดังนี้

    Swift

    หมายเหตุ: ผลิตภัณฑ์นี้ใช้ไม่ได้ในเป้าหมาย 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
    }
    

    Objective-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 ไม่พบลิงก์แบบไดนามิกที่รอดำเนินการที่ตรงกัน

    Swift

    หมายเหตุ: ผลิตภัณฑ์นี้ใช้ไม่ได้ในเป้าหมาย 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
    }
    

    Objective-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;
    }