Google 致力于为黑人社区推动种族平等。查看具体举措

在 iOS 上接收 Dynamic Links 动态链接

如需接收您创建的 Firebase Dynamic Links 动态链接,您必须将 Dynamic Links SDK 添加到应用中,并在应用加载时调用 handleUniversalLink:dynamicLinkFromCustomSchemeURL: 方法,以获取动态链接中传递的数据。

前提条件

在开始之前,请务必将 Firebase 添加到您的 iOS 项目中

  1. 将 Firebase 添加到您的 iOS 项目中
  2. 在您的 Podfile 中添加以下 pod:
    pod 'Firebase/Analytics'
    pod 'Firebase/DynamicLinks'
  3. 运行 pod install 并打开创建的 .xcworkspace 文件。
  4. Firebase 控制台中,打开动态链接部分。如有提示,请接受服务条款。
  5. 确保已在您的应用的设置中指定应用的 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 不同。

  6. 可选:禁止 Dynamic Links SDK 使用 iOS 粘贴板。

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

    这样做的缺点是,在 iOS 14 及更高版本的平台上使用粘贴板会触发通知。因此,当用户第一次打开您的应用时,如果粘贴板中包含动态链接网址,他们会看到一条通知,提示您的应用已访问粘贴板,这可能会引起混淆。

    要阻止此行为,请修改 Xcode 项目的 Info.plist 文件并将 FirebaseDeepLinkPasteboardRetrievalEnabled 键设为 NO

  1. 在应用的 Xcode 项目的 Info 标签中,创建一个新的网址类型以用于动态链接。将 Identifier 字段设为一个唯一的值,将 URL scheme 字段设为软件包标识符,即 Dynamic Links 动态链接使用的默认网址架构。
  2. 在应用的 Xcode 项目的 Capabilities 标签页中,启用 Associated Domains,并将以下内容添加到 Associated Domains 列表中:
    applinks:your_dynamic_links_domain
  3. 如果您想要接收带有完全自定义域名的 Dynamic Links 动态链接,请在 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;
    }