接收动态链接 (iOS)

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

前提条件

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

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

  1. 在 Xcode 中打开您的应用项目,依次点击 File(文件)> Add Packages(添加软件包)
  2. 出现提示时,添加 Firebase Apple 平台 SDK 代码库:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. 选择 Dynamic Links 库。
  5. -ObjC 标志添加到目标 build 设置的“其他链接器标志”部分。
  6. 为了获得最佳的 Dynamic Links 使用体验,我们建议您在 Firebase 项目中启用 Google Analytics,并将 Firebase SDK for Google Analytics 添加到您的应用中。您可以选择收集或者不收集 IDFA 的库。
  7. 完成之后,Xcode 将会自动开始在后台解析和下载您的依赖项。

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

  1. Firebase 控制台中,打开 Dynamic Links 部分。如有提示,请接受服务条款。
  2. 确保已在您的应用的设置中指定应用的 App Store ID 和应用 ID 前缀。如需查看和修改应用的设置,请前往 Firebase 项目的“设置”页面,然后选择您的 iOS 应用。

    您可以打开下面的网址,确认您的 Firebase 项目已正确配置为在 iOS 应用中使用 Dynamic Links

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

    如果您的应用已关联,则 apple-app-site-association 文件中包含对应用 ID 前缀和软件包 ID 的引用。例如:

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

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

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

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

    这样做的缺点是,在 iOS 14 及更高版本的平台上使用粘贴板会触发通知。因此,当用户第一次打开您的应用时,如果粘贴板中包含网址,他们会看到一条通知,提示您的应用已访问粘贴板,用户可能不理解为什么会收到这个通知。

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

  1. 在应用的 Xcode 项目的信息标签页中,创建一个新的网址类型以用于 Dynamic Links。将标识符字段设为一个唯一的值,将网址架构字段设为软件包标识符,即 Dynamic Links 使用的默认网址架构。
  2. 在应用的 Xcode 项目的Capabilities(功能)标签页中,启用“Associated Domains”,并将以下内容添加到 Associated Domains(相关网域)列表中:
    applinks:your_dynamic_links_domain
  3. 如果您想要接收带有完全自定义网域Dynamic Links,请在 Xcode 项目的 Info.plist 文件中,创建一个名为 FirebaseDynamicLinksCustomDomains 的键,并将其设置为应用的 Dynamic Links 网址前缀。例如:
    FirebaseDynamicLinksCustomDomains    https://example.com/promos   https://example.com/links/share 
  4. UIApplicationDelegate 中导入 FirebaseCore 模块,以及您的应用委托 (app delegate) 使用的所有其他 Firebase 模块。 例如,使用 Cloud FirestoreAuthentication

    SwiftUI

    import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...       

    Swift

    import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...       

    Objective-C

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

    SwiftUI

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

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs [FIRApp configure];
  6. 如果您使用的是 SwiftUI,则必须创建应用委托并通过 UIApplicationDelegateAdaptorNSApplicationDelegateAdaptor 将其附加到 App 结构体。您还必须停用应用委托调配。如需了解详情,请参阅 SwiftUI 说明

    SwiftUI

    @main struct YourApp: App {   // register app delegate for Firebase setup   @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate    var body: some Scene {     WindowGroup {       NavigationView {         ContentView()       }     }   } }       
  7. 接下来,在 application:continueUserActivity:restorationHandler: 方法中处理在已安装应用的情况下收到的通用链接形式的链接:

    Swift

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

    如果应用在首次启动时未找到 Dynamic Link,系统在调用此方法时会将 DynamicLinkurl 设置为 nil,以表明 SDK 无法找到匹配的待处理 Dynamic Link

    Swift

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