我正在将我的 React Native 应用程序迁移到 Expo 49。这导致我也将我的 Google 身份验证迁移到
@react-native-google-signin/google-signin
,而不是已弃用的 expo-auth-session
。
我在 iOS 上取得了成功,但 Android 遇到了问题。
当我启动应用程序,然后按
Sign in with Google
按钮时,手机似乎失去了连接,因为我收到日志告诉我套接字何时失去连接以及何时重新连接,以及错误:
[FirebaseError: Firebase: A network AuthError (such as timeout, interrupted connection or unreachable host) has occurred. (auth/network-request-failed).]
为了澄清其他问题,我仔细检查了我的所有 SHA-1 指纹,
debug
和 release
各有一个。这些已添加到我的 Firebase 项目中,并且我拥有最新的 google-services.json
。
我的代码如下:
GoogleSignin.configure({
webClientId: Constants.expoConfig?.extra?.googleWebClientId,
iosClientId: Constants.expoConfig?.extra?.googleiOSClientId,
})
const googleSignIn = async (): Promise<firebase.auth.UserCredential | void> => {
try {
await GoogleSignin.signOut()
const userInformation = await GoogleSignin.signIn()
const googleCredential = GoogleAuthProvider.credential(userInformation.idToken)
const result = await auth.signInWithCredential(googleCredential)
return result
} catch (error: any) {
// handle errors
}
}
以下是我的 firebase 设置:
import 'expo-firestore-offline-persistence'
import Constants from 'expo-constants'
import firebase from 'firebase/compat/app'
import 'firebase/compat/auth'
import 'firebase/compat/firestore'
import 'firebase/compat/storage'
import 'firebase/compat/functions'
const firebaseApp = firebase.apps.length
? firebase.app()
: firebase.initializeApp(Constants.expoConfig?.extra?.firebaseConfig)
firebaseApp.firestore().settings({ experimentalForceLongPolling: true, merge: true })
firebaseApp.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL)
const firestore = firebaseApp.firestore()
const auth = firebaseApp.auth()
const storage = firebaseApp.storage()
const functions = firebase.functions()
const { GoogleAuthProvider } = firebase.auth
const googleProvider = new GoogleAuthProvider()
if (__DEV__) {
const origin = Constants?.expoConfig?.hostUri?.split(':').shift() || 'localhost'
console.log('Origin: ', origin)
auth.useEmulator(`http://${origin}:9099/`)
firestore.useEmulator(origin, 8080)
storage.useEmulator(origin, 9199)
functions.useEmulator(origin, 5001)
}
export { firestore, auth, storage, functions, GoogleAuthProvider, googleProvider }
我检查了Android模拟器设置,并确保启用了
No proxy
,我还看到一些帖子谈论Firebase的DNS,并将localhost
交换为127.0.0.1
,我不太确定这到底是什么意思,但我尝试设置我的const origin = '127.0.0.1'
,不确定这是否就是这个意思。
感谢您的帮助。
该行的输出是什么?
console.log('Origin: ', origin);
应该是10.0.2.2,而不是127.0.0.1 如果输出是 127.0.0.1,那么 firebase 将尝试连接 Android 模拟器的本地主机 (127.0.0.1),而不是主机。
看看:https://developer.android.com/studio/run/emulator-networking