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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:42:50