Nhận đường liên kết động trên iOS

Để nhận Firebase Dynamic Links bạn đã tạo, bạn phải thêm SDK Dynamic Links vào ứng dụng và gọi các phương thức handleUniversalLink:dynamicLinkFromCustomSchemeURL: khi ứng dụng tải để nhận dữ liệu được truyền trong Dynamic Link.

Điều kiện tiên quyết

Trước khi bắt đầu, hãy nhớ thêm Firebase vào dự án iOS.

Sử dụng Swift Package Manager để cài đặt và quản lý các phần phụ thuộc của Firebase.

  1. Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy chuyển đến File > Add Packages (Tệp > Thêm gói).
  2. Khi được nhắc, hãy thêm kho lưu trữ SDK Firebase cho các nền tảng của Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Chọn thư viện Dynamic Links.
  5. Thêm cờ -ObjC vào mục Cờ trình liên kết khác trong chế độ cài đặt bản dựng của mục tiêu.
  6. Để có trải nghiệm tối ưu với Dynamic Links, bạn nên bật Google Analytics trong dự án Firebase và thêm Firebase SDK cho Google Analytics vào ứng dụng của mình. Bạn có thể chọn thư viện không thu thập IDFA hoặc có thu thập IDFA. Hãy xem phần Câu hỏi thường gặp của chúng tôi về cách sắp xếp mới nhất của các mô-đun trong Google Analytics cho SDK Firebase.
  7. Khi hoàn tất, Xcode sẽ tự động bắt đầu phân giải và tải các phần phụ thuộc của bạn xuống ở chế độ nền.

Bây giờ, hãy thực hiện một số bước định cấu hình:

  1. Trong bảng điều khiển Firebase, hãy mở mục Dynamic Links. Chấp nhận điều khoản dịch vụ nếu bạn được nhắc làm như vậy.
  2. Đảm bảo rằng Mã App Store của ứng dụng và tiền tố Mã ứng dụng được chỉ định trong phần cài đặt của ứng dụng. Để xem và chỉnh sửa chế độ cài đặt của ứng dụng, hãy chuyển đến trang Cài đặt của dự án Firebase rồi chọn ứng dụng iOS của bạn.

    Bạn có thể xác nhận rằng dự án Firebase của mình được định cấu hình đúng cách để sử dụng Dynamic Links trong ứng dụng iOS bằng cách mở URL sau:

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

    Nếu ứng dụng của bạn được kết nối, tệp apple-app-site-association sẽ chứa một thông tin tham chiếu đến tiền tố mã nhận dạng ứng dụng và mã nhận dạng gói của ứng dụng. Ví dụ:

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

    Nếu trường details trống, hãy kiểm tra kỹ để đảm bảo rằng bạn đã chỉ định tiền tố App ID. Xin lưu ý rằng tiền tố mã nhận dạng ứng dụng có thể không giống với mã nhận dạng nhóm.

  3. Không bắt buộc: Tắt chế độ sử dụng bảng tạm iOS của SDK Dynamic Links.

    Theo mặc định, SDK Dynamic Links sử dụng bảng tạm để cải thiện độ tin cậy của liên kết sâu sau khi cài đặt. Bằng cách sử dụng bảng tạm, Dynamic Links có thể đảm bảo rằng khi người dùng mở một Dynamic Link nhưng cần cài đặt ứng dụng của bạn trước, người dùng có thể chuyển ngay đến nội dung được liên kết ban đầu khi mở ứng dụng lần đầu tiên sau khi cài đặt.

    Nhược điểm của việc này là việc sử dụng bảng tạm sẽ kích hoạt thông báo trên iOS 14 trở lên. Vì vậy, vào lần đầu tiên người dùng mở ứng dụng của bạn, nếu bảng tạm chứa một URL, họ sẽ thấy thông báo cho biết ứng dụng của bạn đã truy cập vào bảng tạm. Điều này có thể gây nhầm lẫn.

    Để tắt hành vi này, hãy chỉnh sửa tệp Info.plist của dự án Xcode và đặt khoá FirebaseDeepLinkPasteboardRetrievalEnabled thành NO.

  1. Trong thẻ Info (Thông tin) của dự án Xcode cho ứng dụng, hãy tạo một loại URL mới để dùng cho Dynamic Links. Đặt trường Identifier thành một giá trị riêng biệt và trường URL scheme thành giá trị nhận dạng gói của bạn. Đây là giản đồ URL mặc định mà Dynamic Links sử dụng.
  2. Trong thẻ Capabilities (Chức năng) của dự án Xcode cho ứng dụng, hãy bật Associated Domains (Miền được liên kết) và thêm nội dung sau vào danh sách Associated Domains (Miền được liên kết):
    applinks:your_dynamic_links_domain
  3. Nếu bạn muốn nhận Dynamic Links bằng một miền hoàn toàn tuỳ chỉnh, trong tệp Info.plist của dự án Xcode, hãy tạo một khoá có tên là FirebaseDynamicLinksCustomDomains và đặt khoá đó thành tiền tố URL Dynamic Links của ứng dụng. Ví dụ:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. Nhập mô-đun FirebaseCore trong UIApplicationDelegate, cũng như mọi mô-đun Firebase khác mà uỷ quyền ứng dụng của bạn sử dụng. Ví dụ: để sử dụng Cloud FirestoreAuthentication:

    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. Định cấu hình một phiên bản dùng chung FirebaseApp trong phương thức application(_:didFinishLaunchingWithOptions:) của uỷ quyền ứng dụng:

    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. Nếu đang sử dụng SwiftUI, bạn phải tạo một uỷ quyền ứng dụng và đính kèm uỷ quyền đó vào cấu trúc App thông qua UIApplicationDelegateAdaptor hoặc NSApplicationDelegateAdaptor. Bạn cũng phải tắt tính năng thay thế phương thức uỷ quyền của ứng dụng. Để biết thêm thông tin, hãy xem hướng dẫn về 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. Tiếp theo, trong phương thức application:continueUserActivity:restorationHandler: , hãy xử lý các đường liên kết nhận được dưới dạng Đường liên kết phổ quát khi ứng dụng đã được cài đặt:

    Swift

    Lưu ý: Sản phẩm này không có trên các mục tiêu macOS, Mac Catalyst, tvOS hoặc 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

    Lưu ý: Sản phẩm này không có trên các mục tiêu macOS, Mac Catalyst, tvOS hoặc 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. Cuối cùng, trong application:openURL:options:, hãy xử lý các đường liên kết nhận được thông qua giản đồ URL tuỳ chỉnh của ứng dụng. Phương thức này được gọi khi ứng dụng của bạn được mở lần đầu tiên sau khi cài đặt.

    Nếu không tìm thấy Dynamic Link trong lần khởi chạy đầu tiên của ứng dụng, phương thức này sẽ được gọi với url của DynamicLink được đặt thành nil, cho biết rằng SDK không tìm thấy Dynamic Link đang chờ xử lý phù hợp.

    Swift

    Lưu ý: Sản phẩm này không có trên các mục tiêu macOS, Mac Catalyst, tvOS hoặc 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

    Lưu ý: Sản phẩm này không có trên các mục tiêu macOS, Mac Catalyst, tvOS hoặc 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;
    }