升级Firebase后调用[FIRAuth auth] signInAnonymouslyWithCompletion出现块指针类型不兼容错误求助
这个问题我之前帮不少开发者处理过,本质是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

