Catch up on everthing we announced at this year's Firebase Summit. Learn more

在 iOS 上接收動態鏈接

要接收火力地堡的動態鏈接,您創建,必須包括動態鏈接SDK在您的應用程序並調用handleUniversalLink:dynamicLinkFromCustomSchemeURL:當你的應用程序加載到獲得動態鏈接傳遞的數據的方法。

先決條件

在開始之前,請務必火力地堡添加到您的iOS項目

使用 Swift Package Manager 安裝和管理 Firebase 依賴項。

  1. 在Xcode中,您的應用項目打開,導航到File>斯威夫特包>添加包的依賴
  2. 出現提示時,添加 Firebase Apple 平台 SDK 存儲庫:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. 選擇動態鏈接庫。
  5. 對於動態鏈接的最佳體驗,我們建議讓谷歌Analytics(分析)在您的火力地堡項目,並添加火力地堡SDK為谷歌Analytics(分析)應用程式。您可以選擇沒有 IDFA 集合或有 IDFA 集合的庫。
  6. 完成後,Xcode 將在後台自動開始解析和下載您的依賴項。

現在,執行一些配置步驟:

  1. 火力地堡控制台,打開動態鏈接部分。如果系統提示您接受服務條款,請接受。
  2. 確保在應用設置中指定了應用的 App Store ID 和應用 ID 前綴。要查看和編輯您的應用程序的設置,去你的火力地堡項目的設置頁面,選擇您的iOS應用。

    您可以通過打開以下網址來確認您的 Firebase 項目已正確配置為在您的 iOS 應用中使用動態鏈接:

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

    如果您的應用程序連接,在apple-app-site-association的文件包含了您的應用程序的App ID前綴和包ID的參考。例如:

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

    如果details字段為空,仔細檢查你指定你的App ID前綴。請注意,您的 App ID 前綴可能與您的團隊 ID 不同。

  3. 可選:關閉動態鏈接SDK的使用的iOS紙板。

    默認情況下,動態鏈接 SDK 使用粘貼板來提高安裝後深層鏈接的可靠性。通過使用粘貼板,動態鏈接可以確保當用戶打開動態鏈接但需要先安裝您的應用程序時,用戶在安裝後第一次打開應用程序時可以立即轉到原始鏈接的內容。

    這樣做的缺點是使用粘貼板會在 iOS 14 及更高版本上觸發通知。因此,當用戶第一次打開您的應用時,如果粘貼板包含動態鏈接 URL,他們將看到您的應用訪問了粘貼板的通知,這可能會導致混淆。

    要禁用此行為,編輯您的Xcode項目的Info.plist文件,並設置FirebaseDeepLinkPasteboardRetrievalEnabled關鍵NO

  1. 在您的應用程序的Xcode項目的信息標籤,創建用於動態鏈接一個新的URL類型。標識符字段設置為一個獨特的價值和URL方案領域是你的包標識符,它是通過動態鏈接使用的默認URL方案。
  2. 在您的應用程序的Xcode項目的功能選項卡,啟用關聯域和以下添加到關聯的域列表:
    applinks:your_dynamic_links_domain
  3. 如果你想接收動態鏈接了完全自定義域,在您的Xcode項目Info.plist文件,創建一個名為關鍵FirebaseDynamicLinksCustomDomains並將其設置為你的應用程序的動態鏈接網址的前綴。例如:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. 導入火力地堡模塊在UIApplicationDelegate

    迅速

    import Firebase

    目標-C

    @import Firebase;
  5. 配置一個FirebaseApp共享實例,通常在你的應用程序的application:didFinishLaunchingWithOptions:方法:

    迅速

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    目標-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. 接著,在application:continueUserActivity:restorationHandler:接收作為方法,手柄鏈接通用鏈接,當應用程序已安裝(在iOS 9和更新版本):

    迅速

    注:本產品不可在MacOS,Mac的催化劑,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
    }
    

    目標-C

    注:本產品不可在MacOS,Mac的催化劑,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;
    }
  7. 最後,在application:openURL:sourceApplication:annotation: (的iOS 8及以上)和application:openURL:options: (iOS版9及以上)的方法,通過您的應用程序的自定義URL方案對接收處理鏈接。當您的應用在 iOS 8 及更早版本上收到鏈接時,以及在任何版本的 iOS 上安裝後第一次打開您的應用時,都會調用這些方法。

    如果你的應用首次啟動時沒有找到動態鏈接(iOS上的任何版本),該方法將與被稱為FIRDynamicLinkurl設為nil ,表明SDK未能找到掛起動態鏈接匹配。

    迅速

    注:本產品不可在MacOS,Mac的催化劑,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
    }
    

    目標-C

    注:本產品不可在MacOS,Mac的催化劑,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;
    }