获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

在 iOS 上接收动态链接

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

要接收您创建的 Firebase 动态链接,您必须在应用中包含动态链接 SDK,并在应用加载时调用handleUniversalLink:和 dynamicLinkFromCustomSchemeURL dynamicLinkFromCustomSchemeURL:方法以获取动态链接中传递的数据。

先决条件

在开始之前,请确保将 Firebase 添加到您的 iOS 项目中。

使用 Swift Package Manager 安装和管理 Firebase 依赖项。

  1. 在 Xcode 中,打开您的应用项目,导航到File > Add Packages
  2. 出现提示时,添加 Firebase Apple 平台 SDK 存储库:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. 选择动态链接库。
  5. 为了获得动态链接的最佳体验,我们建议在您的 Firebase 项目中启用 Google Analytics ,并将 Firebase SDK for Google Analytics 添加到您的应用中。您可以选择没有 IDFA 集合或有 IDFA 集合的库。
  6. 完成后,Xcode 将在后台自动开始解析和下载您的依赖项。

现在,执行一些配置步骤:

  1. Firebase 控制台中,打开动态链接部分。如果系统提示您,请接受服务条款。
  2. 确保在应用的设置中指定了应用的 App Store 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":["NOT /_/*","/*"]}]}}

    如果details字段为空,请仔细检查您是否指定了 App ID 前缀。请注意,您的 App ID 前缀可能与您的团队 ID 不同。

  3. 可选:禁用动态链接 SDK 对 iOS 粘贴板的使用。

    默认情况下,动态链接 SDK 使用粘贴板来提高安装后深层链接的可靠性。通过使用粘贴板,动态链接可以确保当用户打开动态链接但需要先安装您的应用时,用户在安装后第一次打开应用时可以立即转到原始链接内容。

    这样做的缺点是使用粘贴板会在 iOS 14 及更高版本上触发通知。因此,当用户第一次打开您的应用时,如果粘贴板包含 URL,他们将看到您的应用访问粘贴板的通知,这可能会导致混淆。

    要禁用此行为,请编辑 Xcode 项目的Info.plist文件并将FirebaseDeepLinkPasteboardRetrievalEnabled键设置为NO

  1. 在应用程序的 Xcode 项目的Info选项卡中,创建一个用于动态链接的新 URL 类型。将Identifier字段设置为唯一值,并将URL scheme字段设置为您的包标识符,这是动态链接使用的默认 URL 方案。
  2. 在应用程序 Xcode 项目的Capabilities选项卡中,启用 Associated Domains 并将以下内容添加到Associated Domains列表中:
    applinks:your_dynamic_links_domain
  3. 如果您想接收具有完全自定义域的动态链接,请在您的 Xcode 项目的Info.plist文件中创建一个名为FirebaseDynamicLinksCustomDomains的键并将其设置为您应用的动态链接 URL 前缀。例如:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. 在您的UIApplicationDelegate中导入FirebaseCore模块,以及您的应用委托使用的任何其他Firebase 模块。例如,要使用 Cloud Firestore 和身份验证:

    迅速

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. 在您的应用委托的application(_:didFinishLaunchingWithOptions:)方法中配置FirebaseApp共享实例:

    迅速

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. 接下来,在application:continueUserActivity:restorationHandler:方法中,处理已安装应用程序时作为通用链接接收的链接:

    迅速

    注意:此产品不适用于 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;
    }
  7. 最后,在application:openURL:options:中处理通过应用的自定义 URL 方案接收的链接。当您的应用在安装后首次打开时调用此方法。

    如果在您的应用首次启动时未找到动态链接,则会调用此方法并将DynamicLinkurl设置为nil ,表示 SDK 未能找到匹配的待处理动态链接。

    迅速

    注意:此产品不适用于 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;
    }