本頁面由 Cloud Translation API 翻譯而成。
Switch to English

在iOS上接收動態鏈接

要接收您創建的Firebase動態鏈接,您必須在應用程序中包括Dynamic Links SDK,並在應用程序加載時調用handleUniversalLink:handleUniversalLink: dynamicLinkFromCustomSchemeURL:方法以獲取在動態鏈接中傳遞的數據。

先決條件

Firebase動態鏈接需要iOS 8或更高版本。您可以在應用程序中定位iOS 7,但如果該應用程序未在iOS 8或更高版本上運行,則所有Firebase Dynamic Links SDK調用都將變為無操作。

  1. 將Firebase添加到您的iOS項目 。在Podfile包含以下pod:
    pod 'Firebase/Analytics'
    pod 'Firebase/DynamicLinks'
  2. 運行pod install並打開創建的.xcworkspace文件。
  3. Firebase控制台中 ,打開“ 動態鏈接”部分。如果系統提示您接受服務條款,請接受。
  4. 確保在應用設置中指定了應用的應用商店ID和應用ID前綴。要查看和編輯您的應用程序設置,請轉到Firebase項目的“設置”頁面,然後選擇您的iOS應用程序。

    您可以通過打開以下URL來確認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前綴。請注意,您的應用ID前綴可能與團隊ID不同。

  5. 可選 :禁用Dynamic Links 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的密鑰,並將其設置為應用程序的動態鏈接URL前綴。例如:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. 將Firebase模塊導入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及更高版本上)作為通用鏈接接收的鏈接

    迅速

    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

    - (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無法找到匹配的待處理動態鏈接。

    迅速

    @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

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