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

Expo Go中Firebase函数未定义问题求助(Web端正常)

Expo Go中Firebase函数未定义的解决方案及疑问解答

问题核心原因

  1. signInWithRedirect不兼容Expo Go:该方法依赖浏览器跳转完成认证,但Expo Go是沙盒式原生环境,无法处理这类跳转逻辑,因此会触发函数未定义或功能失效问题。
  2. 代码遗漏关键导入:你的代码中未导入useState和useEffect,这会导致组件逻辑报错,间接影响Firebase功能正常执行。
  3. Firebase初始化细节:getAuth()最好显式传入初始化后的app实例,避免环境差异导致的实例获取异常。

解决方案步骤

1. 替换认证方法(适配Expo Go)

使用Expo官方推荐的expo-auth-session配合Firebase完成Google登录,替代signInWithRedirect:

  • 先安装依赖:
npx expo install expo-auth-session expo-random
  • 修改后的代码示例:
import { View, TouchableOpacity, Text } from 'react-native';
import { Stack, useRouter } from 'expo-router';
import { useState, useEffect } from 'react'; // 补充遗漏的导入
import * as AuthSession from 'expo-auth-session';
import { initializeApp } from "firebase/app";
import { getAuth, GoogleAuthProvider, signInWithCredential } from 'firebase/auth';

const firebaseConfig = {
  // 你的Firebase配置
};

// 初始化Firebase
const app = initializeApp(firebaseConfig);
const auth = getAuth(app); // 显式传入app实例

// 从Firebase控制台获取Web客户端ID
const GOOGLE_CLIENT_ID = '你的Google Web客户端ID';
const discovery = {
  authorizationEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth',
  tokenEndpoint: 'https://oauth2.googleapis.com/token',
  revocationEndpoint: 'https://oauth2.googleapis.com/revoke',
};

function Login() {
    const router = useRouter();
    const [loggedIn, setLoggedIn] = useState(false);
    const [request, response, promptAsync] = AuthSession.useAuthRequest(
      {
        clientId: GOOGLE_CLIENT_ID,
        scopes: ['profile', 'email'],
        redirectUri: AuthSession.makeRedirectUri(),
      },
      discovery
    );

    useEffect(() => {
      if (response?.type === 'success') {
        const { code } = response.params;
        const credential = GoogleAuthProvider.credential(null, code);
        signInWithCredential(auth, credential)
          .then((userCredential) => {
            console.log('登录成功:', userCredential.user);
            setLoggedIn(true);
          })
          .catch((error) => {
            console.error('登录失败:', error.code, error.message);
          });
      }
    }, [response]);

    useEffect(() => {
        if (loggedIn) router.push('main');
    }, [loggedIn]);
    
    return (
        <View style={{ flex: 1, padding: SIZES.medium }} >
          <TouchableOpacity onPress={() => promptAsync()} disabled={!request}>
            <Text>Login with Google</Text>
          </TouchableOpacity>
        </View>
    );
}

export default Login;

2. 验证Firebase依赖安装

确保已正确安装Firebase SDK:

npm install firebase

是否需要完整构建应用?

  • 不需要的场景:如果替换认证方法后功能正常,仅使用Firebase核心功能(如数据库、存储),Expo Go完全可以满足需求,无需完整构建。
  • 需要的场景:若必须使用signInWithRedirect等Expo Go不支持的功能,或需要更高性能、深度原生集成,则需执行:
    1. 运行npx expo prebuild生成原生项目文件
    2. 在Firebase控制台下载对应平台的配置文件(Android为google-services.json,iOS为GoogleService-Info.plist),放入原生项目目录
    3. 构建并运行原生应用

Expo官方Firebase指南核心要点(翻译)

  • Expo Go支持Firebase多数核心功能,但依赖浏览器或原生配置的功能(如跳转认证、特定云函数触发器)在Expo Go中无法正常工作。
  • 针对Expo Go环境,推荐使用Expo AuthSession或Firebase的signInWithPopup(部分场景支持)实现第三方认证,而非signInWithRedirect。
  • 预构建或完整构建原生应用后,可配置原生Firebase SDK,获得更完整的功能支持和更好的性能。

内容的提问来源于stack exchange,提问作者Juan García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:09:57