Expo AuthSession首次调用异常:gglResponse返回null问题求助
Expo Auth Session 首次调用登录方法时响应为null的问题
我用expo-auth-session实现Facebook和Google登录,遇到一个棘手的问题:首次调用gglPromptAsync()(Facebook对应方法同理)后,gglResponse返回null;但第二次调用该方法,用户完成提供商认证后,就能成功获取响应。
已尝试的解决措施
- 调用
gglPromptAsync()前,在不同页面打印AppState.currentState - 给
gglPromptAsync()添加useProxy: true和showInRecents: true参数 - 发现该问题3年前就有人提出过解决方案,但至今仍存在
Google登录代码片段(Facebook逻辑一致)
import * as Google from 'expo-auth-session/providers/google'; const [gglRequest, gglResponse, gglPromptAsync] = Google.useAuthRequest({ expoClientId: mobileSettings.expoClientId, iosClientId: mobileSettings.iosClientId, androidClientId: mobileSettings.AndroidClientId }); const onSignInPressed = async (ssoType: SSOType) => { await gglPromptAsync({ showInRecents: true, useProxy: true }); if (gglResponse?.type === 'success') { // 首次请求时gglResponse为null const { authentication } = gglResponse; await login(ssoType, authentication?.accessToken || ""); } else { return; } };
可能的解决方案
1. 监听响应状态变化,而非在prompt后立即判断
gglResponse是useAuthRequest返回的状态变量,它的更新是异步的。你在await gglPromptAsync()后立刻判断,此时状态可能还没完成更新。改用useEffect监听gglResponse的变化,当响应返回后再处理登录逻辑:
import * as Google from 'expo-auth-session/providers/google'; import { useEffect } from 'react'; const [gglRequest, gglResponse, gglPromptAsync] = Google.useAuthRequest({ expoClientId: mobileSettings.expoClientId, iosClientId: mobileSettings.iosClientId, androidClientId: mobileSettings.AndroidClientId }); // 监听响应变化,处理登录逻辑 useEffect(() => { if (gglResponse?.type === 'success') { const { authentication } = gglResponse; login(SSOType.Google, authentication?.accessToken || ""); } }, [gglResponse]); const onSignInPressed = async (ssoType: SSOType) => { await gglPromptAsync({ showInRecents: true, useProxy: true }); };
2. 确保请求已初始化完成再调用prompt
有时候gglRequest可能还没完成初始化,此时调用gglPromptAsync()会导致异常。在调用前先检查请求状态:
const onSignInPressed = async (ssoType: SSOType) => { if (!gglRequest) { // 请求未准备好,可提示用户稍后重试 return; } await gglPromptAsync({ showInRecents: true, useProxy: true }); };
3. 核对平台Client ID配置
确认mobileSettings中的expoClientId、iosClientId、androidClientId是否对应正确的平台,ID配置错误也可能导致首次请求无响应。
内容的提问来源于stack exchange,提问作者Ben Phung
相关产品推荐
相关产品推荐

