在 iOS 上接收动态链接

如需接收您创建的 Firebase 动态链接,您必须将 Dynamic Links SDK 添加到应用中,并在应用加载时调用 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. 确保已在您的应用的设置中指定应用的 App Store ID 和应用 ID 前缀。要查看和修改应用的设置,请转到 Firebase 项目的“设置”页面,然后选择您的 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 字段为空,请仔细检查您是否指定了应用 ID 前缀。请注意,应用 ID 前缀可能与团队 ID 不同。

  1. 在应用的 Xcode 项目的 Info 标签中,创建一个新的网址类型以用于动态链接。将 Identifier 字段设为一个唯一的值,将 URL scheme 字段设为软件包标识符,即动态链接使用的默认网址架构。
  2. 在应用的 Xcode 项目的 Capabilities 标签页中,启用 Associated Domains,并将以下内容添加到 Associated Domains 列表中:
    applinks:your_dynamic_links_domain
  3. 如果您想要接收带有完全自定义网域的动态链接,请在 Xcode 项目的 Info.plist 文件中,创建一个名为 FirebaseDynamicLinksCustomDomains 的键,并将其设置为应用的动态链接网址前缀。例如:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. UIApplicationDelegate 中导入 Firebase 模块:

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  5. 配置一个 FirebaseApp 共享实例(通常在应用的 application:didFinishLaunchingWithOptions: 方法中配置):

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. 如果已经(在 iOS 9 及更高版本上)安装了应用,则接下来在 application:continueUserActivity:restorationHandler: 方法中处理收到的通用链接形式的链接:

    Swift

    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

    - (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 及更高版本)方法中,处理通过应用的自定义网址架构接收的链接。 当您的应用在 iOS 8 及以下版本上接收链接时,以及在安装到任何 iOS 版本上后首次被打开时,都会调用这些方法。

    如果在您的应用(在任何 iOS 版本上)首次启动时未找到动态链接,系统在调用此方法时会将 FIRDynamicLinkurl 设置为 nil,以表明 SDK 未找到匹配的待处理动态链接。

    Swift

    @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

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