在 iOS 上接收 Dynamic Links

若要接收符合下列條件的 Firebase Dynamic Links: ,您必須在應用程式中加入 Dynamic Links SDK,並呼叫 handleUniversalLink:dynamicLinkFromCustomSchemeURL: 方法。

事前準備

開始之前,請務必將 Firebase 新增至 iOS 專案

使用 Swift Package Manager 安裝及管理 Firebase 依附元件。

  1. 在 Xcode 中保持開啟應用程式專案,然後依序選擇 [檔案] >新增套件
  2. 在系統提示時,新增 Firebase Apple 平台 SDK 存放區:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. 選擇 Dynamic Links 程式庫。
  5. 在目標建構設定的「Other Linker Flags」部分中新增 -ObjC 標記。
  6. 為了獲得最佳的 Dynamic Links 使用體驗,建議您 啟用 Google Analytics ,然後將 Google Analytics 專用 Firebase SDK 加進應用程式。你可以 選取沒有收集廣告識別碼 (IDFA) 或收集廣告識別碼的程式庫。
  7. 完成後,Xcode 會自動開始解析並下載 複製到背景依附元件

現在,請執行一些設定步驟:

  1. Firebase 控制台,開啟「Dynamic Links」 專區。如果系統提示您接受服務條款,請接受《服務條款》。
  2. 請確保應用程式的 App Store ID,且應用程式 ID 前置字串為 您在應用程式的設定中指定。如要查看及編輯應用程式設定,請前往 連結至 Firebase 專案的 「設定」頁面,然後選取您的 iOS 應用程式。

    您可以確認 Firebase 專案已正確設定並使用 開啟以下網址,在 iOS 應用程式中使用 Dynamic Links:

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

    如果應用程式已連線,則 apple-app-site-association 檔案會包含參照 改成應用程式的應用程式 ID 前置字串和軟體包 ID。例如:

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

    如果 details 欄位空白,請仔細檢查您指定的設定 您的應用程式 ID 前置字串。請注意,您的應用程式 ID 前置字串可能與團隊 ID 不同。

  3. 選用:禁止 Dynamic Links SDK 使用 iOS 貼上。

    根據預設,Dynamic Links SDK 會使用貼上板改善 安裝後深層連結的可靠性Dynamic Links 可確保在使用者開啟 Dynamic Links 但需要安裝 應用程式放在第一位時,使用者就能立即進入原始連結的內容。 安裝後首次開啟應用程式。

    不過,使用貼上板會觸發 通知功能。因此,使用者首次開啟應用程式時 如果貼上板中含有網址,他們就會看到通知 這可能會造成混淆。

    如要停用這個行為,請編輯 Xcode 專案的 Info.plist 檔案並設定 將金鑰設為「FirebaseDeepLinkPasteboardRetrievalEnabledNO

  1. 在應用程式 Xcode 專案的「Info」分頁中建立新的 用於 Dynamic Links 的網址類型。將 [Identifier] (識別碼) 欄位輸入不重複的值,以及「URL cheme」(網址配置) 欄位 必須是軟體包識別碼,也就是 Dynamic Links 使用的預設網址配置。
  2. 在應用程式 Xcode 專案的「Capabilities」分頁中, 啟用關聯網域,並將下列指令新增至 Associated 網域清單:
    applinks:your_dynamic_links_domain
  3. 如要接收含有 完全自訂網域 Xcode 專案的 Info.plist 檔案,建立名為 FirebaseDynamicLinksCustomDomains,並將其設為應用程式的 Dynamic Links 網址前置字元。例如:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. FirebaseCore 模組匯入至 UIApplicationDelegate和任何其他 應用程式委派所用的 Firebase 模組。 例如,如要使用 Cloud Firestore 和驗證功能:

    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,則必須建立並附加應用程式委派 透過 UIApplicationDelegateAdaptorApp 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: 方法中,處理以 形式接收的連結 通用連結 (如果應用程式已安裝):

    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: 處理常式中 您的應用程式自訂網址配置。系統會在 您的應用程式在安裝後首次開啟。

    如果在應用程式首次啟動時找不到動態連結,系統就會使用 DynamicLinkurl 設為 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;
    }