React Native使用expo谷歌登录iOS端报未处理Promise拒绝错误
Expo iOS端谷歌登录报expo-app-auth.authAsync不可用问题解决
报错本质是旧版谷歌登录依赖包废弃、原生依赖未正确关联、代码未做Promise错误捕获三类问题共同导致,按以下步骤排查即可解决:
排查解决步骤
- 替换已废弃的依赖
你当前用的expo-google-app-auth包已经被Expo官方正式弃用,SDK 48及以上版本已经不再内置对应的expo-app-auth原生模块,直接调用就会报方法不存在的错误。先执行命令卸载旧依赖:
换成官方当前推荐的AuthSession方案实现谷歌登录,安装对应依赖:npm uninstall expo-google-app-auth expo-app-authnpx expo install expo-auth-session expo-crypto expo-web-browser - 修正代码逻辑与配置
原代码存在三个明显问题:- async函数内调用Promise只写了
.then没有加.catch,所有异常都会触发Possible Unhandled Promise Rejection报错 - 配置项存在拼写错误:
premissions为错误拼写,正确字段名是permissions - 配置里传入的
public_profile、gender、location是Facebook登录的权限范围,谷歌OAuth接口不支持这些参数,传值无效
替换依赖后可参考以下正确实现:
import React, { createContext, useContext, useEffect, useState } from 'react' import * as Google from 'expo-auth-session/providers/google'; import * as WebBrowser from 'expo-web-browser'; // 处理授权完成后的回调跳转 WebBrowser.maybeCompleteAuthSession(); const AuthContext = createContext({}) // 替换为你自己谷歌云控制台申请的对应客户端ID const config = { androidClientId: '你的安卓端客户端ID', iosClientId: '你的iOS端客户端ID', scopes: ["profile", "email"], } export const AuthProvider = ({ children }) => { const [user, setUser] = useState(null); const [request, response, promptAsync] = Google.useAuthRequest(config); useEffect(() => { if (response?.type === 'success') { const { authentication } = response; // 此处可拿authentication.accessToken请求谷歌用户信息接口,完成登录态写入 } }, [response]) const signInWithGoogle = async () => { // 必须加try/catch捕获所有异步异常,避免触发未处理Promise报错 try { await promptAsync(); } catch (err) { console.log('谷歌登录流程异常:', err); } }; return ( <AuthContext.Provider value={{ user, signInWithGoogle }} > {children} </AuthContext.Provider> ) } export default function useAuth() { return useContext(AuthContext) } - async函数内调用Promise只写了
- 校验原生环境匹配度
- 如果用Expo Go调试:确保手机端安装的Expo Go版本和本地项目的Expo SDK版本完全匹配,版本差超过1个大版本就会出现原生模块找不到的问题,在项目目录执行
npx expo install对齐依赖版本后,将手机端Expo Go更新到对应版本即可。 - 如果用自定义开发客户端调试:安装完带原生代码的新依赖后,必须重新打包iOS开发客户端再安装到测试机,新增的原生模块不会通过热更新生效,执行打包命令重新构建即可。
- 如果用Expo Go调试:确保手机端安装的Expo Go版本和本地项目的Expo SDK版本完全匹配,版本差超过1个大版本就会出现原生模块找不到的问题,在项目目录执行
- 校验客户端ID配置
确认谷歌云控制台中创建iOS客户端ID时填写的Bundle ID,和项目app.json里ios.bundleIdentifier字段的值完全一致,同时把iOS客户端ID对应的URL Scheme添加到app.json的ios.scheme配置中,避免授权完成后无法跳回App。
内容的提问来源于stack exchange,提问作者haymovich
相关产品推荐
相关产品推荐

