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

React Native使用expo谷歌登录iOS端报未处理Promise拒绝错误

Expo iOS端谷歌登录报expo-app-auth.authAsync不可用问题解决

报错本质是旧版谷歌登录依赖包废弃、原生依赖未正确关联、代码未做Promise错误捕获三类问题共同导致,按以下步骤排查即可解决:

排查解决步骤

  • 替换已废弃的依赖
    你当前用的expo-google-app-auth包已经被Expo官方正式弃用,SDK 48及以上版本已经不再内置对应的expo-app-auth原生模块,直接调用就会报方法不存在的错误。先执行命令卸载旧依赖:
    npm uninstall expo-google-app-auth expo-app-auth
    
    换成官方当前推荐的AuthSession方案实现谷歌登录,安装对应依赖:
    npx expo install expo-auth-session expo-crypto expo-web-browser
    
  • 修正代码逻辑与配置
    原代码存在三个明显问题:
    1. async函数内调用Promise只写了.then没有加.catch,所有异常都会触发Possible Unhandled Promise Rejection报错
    2. 配置项存在拼写错误:premissions为错误拼写,正确字段名是permissions
    3. 配置里传入的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)
    }
    
  • 校验原生环境匹配度
    • 如果用Expo Go调试:确保手机端安装的Expo Go版本和本地项目的Expo SDK版本完全匹配,版本差超过1个大版本就会出现原生模块找不到的问题,在项目目录执行npx expo install对齐依赖版本后,将手机端Expo Go更新到对应版本即可。
    • 如果用自定义开发客户端调试:安装完带原生代码的新依赖后,必须重新打包iOS开发客户端再安装到测试机,新增的原生模块不会通过热更新生效,执行打包命令重新构建即可。
  • 校验客户端ID配置
    确认谷歌云控制台中创建iOS客户端ID时填写的Bundle ID,和项目app.json里ios.bundleIdentifier字段的值完全一致,同时把iOS客户端ID对应的URL Scheme添加到app.json的ios.scheme配置中,避免授权完成后无法跳回App。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:33:18