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

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

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

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

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

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

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

  1. เปิดส่วน ในคอนโซลFirebaseDynamic Links และยอมรับข้อกำหนดในการให้บริการหากระบบแจ้งให้ดำเนินการ
  2. ตรวจสอบว่าได้ระบุรหัส App Store ของแอปและคำนำหน้ารหัสแอปแล้ว ในการตั้งค่าของแอป หากต้องการดูและแก้ไขการตั้งค่าของแอป ให้ไป ที่หน้าการตั้งค่าของโปรเจ็กต์ 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 จะใช้คลิปบอร์ดเพื่อปรับปรุงความน่าเชื่อถือของ Deep Link หลังการติดตั้ง การใช้คลิปบอร์ดช่วยให้ Dynamic Links มั่นใจได้ว่าเมื่อผู้ใช้เปิดDynamic Link แต่ต้องติดตั้งแอปก่อน ผู้ใช้จะไปยังเนื้อหาที่ลิงก์ไว้เดิมได้ทันทีเมื่อ เปิดแอปเป็นครั้งแรกหลังการติดตั้ง

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

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

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

    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 ของ DynamicLink เป็น nil ซึ่งบ่งบอกว่า SDK ไม่พบ Dynamic Link ที่รอดำเนินการที่ตรงกันurl

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