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

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

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

ก่อนเริ่มต้น โปรดเพิ่ม Firebase ลงในโปรเจ็กต์ iOS

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

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

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

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

    คุณยืนยันได้ว่าโปรเจ็กต์ Firebase ได้รับการกำหนดค่าอย่างถูกต้องเพื่อใช้ Dynamic Links ในแอป 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ไม่มีข้อมูล ให้ตรวจสอบอีกครั้งว่าคุณได้ระบุ คำนำหน้า App ID แล้ว โปรดทราบว่าคำนำหน้ารหัสแอปอาจไม่เหมือนกับรหัสทีม

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

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

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

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

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

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

    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 *)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;
    }