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

升级Firebase后调用[FIRAuth auth] signInAnonymouslyWithCompletion出现块指针类型不兼容错误求助

解决Firebase升级后匿名登录Block类型不兼容问题

这个问题我之前帮不少开发者处理过,本质是Firebase Auth升级后,signInAnonymouslyWithCompletion的回调签名发生了变更,导致你的旧代码和新API的参数类型不匹配,才抛出了这个类型错误。

错误原因

在旧版本的Firebase Auth中,signInAnonymouslyWithCompletion的回调直接返回FIRUser和NSError;但升级后的新版本(大概从Firebase Auth 6.x开始),回调参数换成了FIRAuthDataResult(包含用户信息和登录附加数据)和NSError。你的代码还在使用旧的block签名,自然会触发类型不兼容的报错。

修复方案

只需要修改回调block的参数类型,并通过FIRAuthDataResult对象获取用户实例即可,具体步骤如下:

1. 替换回调参数

把原来的(FIRUser *__strong user, NSError *__strong error)替换为(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error)

2. 从authResult中获取用户对象

在回调内部,通过authResult.user拿到原来的FIRUser实例,后续的业务逻辑可以完全复用之前的代码。

代码对比

报错的旧代码:

[[FIRAuth auth] signInAnonymouslyWithCompletion:^(FIRUser *__strong user, NSError *__strong error) {
    if (error) {
        // 错误处理逻辑
        return;
    }
    // 使用user进行业务操作
    NSLog(@"匿名用户ID:%@", user.uid);
}];

修复后的新代码:

[[FIRAuth auth] signInAnonymouslyWithCompletion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
    if (error) {
        // 错误处理逻辑可以保留不变
        NSLog(@"匿名登录失败:%@", error.localizedDescription);
        return;
    }
    // 从authResult中取出用户对象
    FIRUser *user = authResult.user;
    // 原来基于user的业务逻辑完全复用
    NSLog(@"匿名用户ID:%@", user.uid);
}];

额外提示

不止匿名登录,Firebase Auth中其他登录方法(比如邮箱密码登录、第三方登录等)的回调签名也做了同样的变更,如果你项目里还有其他类似的报错,都可以用同样的方式修改——把直接接收FIRUser换成接收FIRAuthDataResult,再从中提取用户对象。

内容的提问来源于stack exchange,提问作者spectre_d2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:49:06