Firebase Auth谷歌重定向登录iOS报Unhandled Promise Rejection错误如何处理
错误原因
这个Unhandled Promise Rejection: TypeError: Right side of assignment cannot be destructured报错触发有两个核心原因:
- 混用了两个不同CDN源的Firebase模块:firebase-app从gstatic加载,firebase-auth从cdnjs加载,即使版本号相同,不同CDN打包的代码也可能存在内部依赖逻辑的微小差异,导致模块间调用异常。
- 9.3.0版本的Firebase Auth存在iOS Safari兼容性已知bug:iOS Safari默认启用智能跟踪预防(ITP)机制,会限制第三方跨站存储读写,该版本的
getRedirectResult内部处理登录态时,预期的返回对象在ITP限制下会变成null/undefined,内部解构操作执行失败抛出错误。 - 额外的代码隐患:没有对
getRedirectResult的返回结果做判空处理,当用户不是从第三方登录重定向回来的场景下,result会直接返回null,直接读取result.user也会触发类型错误。
修复方案
按优先级执行以下操作即可解决问题:
- 统一所有Firebase模块的CDN源,不要混用gstatic和cdnjs的资源,将auth模块的导入地址替换为gstatic同源地址:
import { getAuth, getRedirectResult } from "https://www.gstatic.com/firebasejs/9.3.0/firebase-auth.js";
- 对
getRedirectResult的返回结果新增判空逻辑,避免空值读取报错:
getRedirectResult(auth) .then((result) => { // 新增判空,非重定向场景直接跳过处理 if (!result) return const user = result.user; // 原有业务代码 }).catch((error) => { const errorCode = error.code; const errorMessage = error.message; alert(errorMessage) });
- 初始化auth实例时显式传入已创建的app实例,避免多实例场景下的绑定错误:
const auth = getAuth(app);
- 条件允许的情况下,将Firebase版本升级到9.6.0及以上,该版本官方已经修复了iOS Safari ITP场景下的
getRedirectResult解构bug。
内容的提问来源于stack exchange,提问作者Ju Long
相关产品推荐
相关产品推荐

