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

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

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

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

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

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

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

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

    คุณสามารถตรวจสอบว่าโปรเจ็กต์ Firebase ได้รับการกําหนดค่าอย่างถูกต้องเพื่อใช้ Dynamic Links ในแอป 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 จะใช้ Pasteboard เพื่อปรับปรุงความน่าเชื่อถือของ Deep Link หลังการติดตั้ง เมื่อใช้คลิปบอร์ด 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 พร้อมโดเมนที่กำหนดเองทั้งหมด ให้สร้างคีย์ชื่อ FirebaseDynamicLinksCustomDomains ในไฟล์ Info.plist ของโปรเจ็กต์ Xcode แล้วตั้งค่าเป็นคำนำหน้า 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. กำหนดค่าอินสแตนซ์ที่แชร์ในเมธอด application(_:didFinishLaunchingWithOptions:) ของตัวแทนแอป ดังนี้ FirebaseApp

    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 struct ผ่าน 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<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 ที่กำหนดเองของแอป ระบบจะเรียกใช้เมธอดนี้เมื่อแอปเปิดเป็นครั้งแรกหลังจากการติดตั้ง

    หากไม่พบ Dynamic Link ในการเปิดแอปครั้งแรก ระบบจะเรียกใช้เมธอดนี้โดยตั้งค่า url ของ DynamicLink เป็น 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<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;
    }