You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Firebase动态链接在iOS<=9首次安装时无法正常工作

针对Firebase动态链接iOS<=9首次安装无回调/参数为空的解决方案

我之前也碰到过几乎一模一样的问题,折腾了好久才梳理出几个关键的修复点,你可以逐一排查:

1. iOS 8 专属:启动时主动拉取动态链接

iOS 8 系统下,从 App Store 首次安装并启动应用后,系统不会自动把动态链接的参数通过代理方法传递过来,这时候必须主动触发拉取:

在 application:didFinishLaunchingWithOptions: 里,完成 Firebase 初始化后,立即调用:

[[FIRDynamicLinks dynamicLinks] fetchDynamicLinksWithCompletionHandler:^(NSArray<FIRDynamicLink *> * _Nullable dynamicLinks, NSError * _Nullable error) {
    if (error) {
        NSLog(@"获取动态链接失败: %@", error.localizedDescription);
        return;
    }
    for (FIRDynamicLink *dynamicLink in dynamicLinks) {
        // 这里处理你的动态链接逻辑
        if ([dynamicLink.url.host isEqualToString:@"你的动态链接域名"]) {
            // 解析参数、跳转对应页面等
        }
    }
}];

Swift 版本:

DynamicLinks.dynamicLinks().fetchDynamicLinks { (dynamicLinks, error) in
    guard error == nil else {
        print("获取动态链接失败: \(error!.localizedDescription)")
        return
    }
    if let links = dynamicLinks {
        for link in links {
            if let url = link.url, url.host == "你的动态链接域名" {
                // 处理链接逻辑
            }
        }
    }
}

这个方法会主动去 Firebase 服务器拉取当前设备对应的未处理动态链接,弥补 iOS 8 系统的回调缺失问题。

iOS 9 及以上默认用 Universal Links,出现 dynamicLink 为 nil 大概率是以下两个问题:

  • 确保 continueUserActivity:restorationHandler: 正确实现:
    这个方法是 Universal Links 回调的关键,你需要在 AppDelegate 里添加:
  • (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id> * _Nullable))restorationHandler {
    BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL completion:^(FIRDynamicLink * _Nullable dynamicLink, NSError * _Nullable error) {
    if (error) {
    NSLog(@"处理 Universal Link 失败: %@", error.localizedDescription);
    return;
    }
    if (dynamicLink) {
    // 处理动态链接
    }
    }];
    return handled;
    }
    Swift 版本:
    ```swift
    

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
let handled = DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { (dynamicLink, error) in
if let error = error {
print("处理 Universal Link 失败: (error.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
// 处理动态链接
}
}
return handled
}

- **验证 Associated Domains 配置**:
确保你的 App ID 已开启 Associated Domains,并且在 Xcode 的 `Signing & Capabilities` 里添加了 `applinks:你的动态链接域名`(比如 `applinks:xxx.page.link`)。同时检查 Firebase 控制台里的动态链接域名是否和这里一致。

## 3. 通用排查点:确保动态链接生成与跳转流程正确
- **检查动态链接的 iOS 配置**:生成动态链接时,必须指定正确的 `iOS Bundle ID`,并且确保没有设置错误的跳转限制(比如过期时间、地区限制)。
- **测试时避免用备忘录的链接直接跳转**:可以尝试用 Safari 直接打开动态链接,再跳转 App Store,有时候备忘录的链接会被系统转义导致参数丢失。
- **确认 Firebase 初始化时机**:必须在 `application:didFinishLaunchingWithOptions:` 的最开始就初始化 Firebase(`[FIRApp configure];` 或 `FirebaseApp.configure()`),不要延迟初始化,否则会错过回调时机。

## 4. 额外:iOS 8 下的 URL Scheme 回调补充
虽然你说已经实现了代理方法,但再确认下 `application:openURL:sourceApplication:annotation:` 是否正确处理了动态链接:
```objc
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
  BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:url completion:^(FIRDynamicLink * _Nullable dynamicLink, NSError * _Nullable error) {
      // 处理逻辑
  }];
  return handled;
}

Swift 版本:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    let handled = DynamicLinks.dynamicLinks().handleUniversalLink(url) { (dynamicLink, error) in
        // 处理逻辑
    }
    return handled
}

按照这些步骤排查后,我当时的问题就解决了,希望对你也有用!

内容的提问来源于stack exchange,提问作者Petre-Daniel Puiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:50:46