我需要将 google 登录方法添加到我的 React native 应用程序中。我使用了“react-native-google-signin”包。我也在谷歌控制台中制作了一个项目。但是当我尝试登录时出现错误。它给出了错误“发生了其他错误”,它在我的“_signIn()”函数中。请帮助我解决我的问题。
这是我尝试过的
import React from 'react';
import {
StyleSheet,
Text,
View,
Alert,
Image,
ActivityIndicator,
TouchableOpacity,
} from 'react-native';
import {
GoogleSignin,
GoogleSigninButton,
statusCodes,
} from 'react-native-google-signin';
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
userInfo: null,
gettingLoginStatus: true,
};
}
componentDidMount() {
//initial configuration
GoogleSignin.configure({
//It is mandatory to call this method before attempting to call signIn()
scopes: ['https://www.googleapis.com/auth/drive.readonly'],
// Repleace with your webClientId generated from Firebase console
webClientId: 'my webclient id',
});
//Check if user is already signed in
this._isSignedIn();
}
_isSignedIn = async () => {
const isSignedIn = await GoogleSignin.isSignedIn();
if (isSignedIn) {
alert('User is already signed in');
//Get the User details as user is already signed in
this._getCurrentUserInfo();
} else {
//alert("Please Login");
// console.log('Please Login');
alert('Please Login');
}
this.setState({ gettingLoginStatus: false });
};
_getCurrentUserInfo = async () => {
try {
const userInfo = await GoogleSignin.signInSilently();
console.log('User Info --> ', userInfo);
this.setState({ userInfo: userInfo });
} catch (error) {
if (error.code === statusCodes.SIGN_IN_REQUIRED) {
alert('User has not signed in yet');
console.log('User has not signed in yet');
} else {
alert("Something went wrong. Unable to get user's info");
console.log("Something went wrong. Unable to get user's info");
}
}
};
_signIn = async () => {
//Prompts a modal to let the user sign in into your application.
try {
await GoogleSignin.hasPlayServices({
//Check if device has Google Play Services installed.
//Always resolves to true on iOS.
showPlayServicesUpdateDialog: true,
});
const userInfo = await GoogleSignin.signIn();
console.log('User Info --> ', userInfo);
this.setState({ userInfo: userInfo });
} catch (error) {
console.log('Message', error.message);
if (error.code === statusCodes.SIGN_IN_CANCELLED) {
console.log('User Cancelled the Login Flow');
} else if (error.code === statusCodes.IN_PROGRESS) {
console.log('Signing In');
} else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
console.log('Play Services Not Available or Outdated');
} else {
console.log('Some Other Error Happened');
}
}
};
_signOut = async () => {
//Remove user session from the device.
try {
await GoogleSignin.revokeAccess();
await GoogleSignin.signOut();
this.setState({ userInfo: null }); // Remove the user from your app's state as well
} catch (error) {
console.error(error);
}
};
render() {
//returning Loader untill we check for the already signed in user
if (this.state.gettingLoginStatus) {
return (
<View style={styles.container}>
<ActivityIndicator size="large" color="#0000ff" />
</View>
);
} else {
if (this.state.userInfo != null) {
//Showing the User detail
return (
<View style={styles.container}>
<Image
source={{ uri: this.state.userInfo.user.photo }}
style={styles.imageStyle}
/>
<Text style={styles.text}>
Name: {this.state.userInfo.user.name}{' '}
</Text>
<Text style={styles.text}>
Email: {this.state.userInfo.user.email}
</Text>
<TouchableOpacity style={styles.button} onPress={this._signOut}>
<Text>Logout</Text>
</TouchableOpacity>
</View>
);
} else {
//For login showing the Signin button
return (
<View style={styles.container}>
<GoogleSigninButton
style={{ width: 312, height: 48 }}
size={GoogleSigninButton.Size.Wide}
color={GoogleSigninButton.Color.Light}
onPress={this._signIn}
/>
</View>
);
}
}
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
imageStyle: {
width: 200,
height: 300,
resizeMode: 'contain',
},
button: {
alignItems: 'center',
backgroundColor: '#DDDDDD',
padding: 10,
width: 300,
marginTop: 30,
},
});
最佳答案
我也在为同样的问题苦苦挣扎,有效的方法是像这样将 androidClientId
键添加到配置对象
GoogleSignin.configure({
scopes: ["MY SCOPE"],
offlineAccess: true,
webClientId: WEB_CLIENT_ID,
androidClientId: ANDROID_CLIENT_ID, // <-- Added here
});
引用下图由@Deepak Singh in his answer分享,WEB_CLIENT_ID
将是带圆圈的那个,ANDROID_CLIENT_ID
将是最上面的一个。
关于react-native - 如何在没有 Firebase 的情况下为 React Native App 设置 Google 登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63846746/
相关文章:
javascript - 如何在 react 中的不同组件库之间共享上下文?
flutter - 如何在 Flutter 中绘制尖三角形边?
gradle - React Native 项目 Android Gradle Fail (Reac
javascript - select2 on select data-select2-id 属性添
tensorflow - Keras SavedModel 与 Tensorflow SavedMo
python - 使用 tokenizer.encode_plus 时遇到问题
javascript - 使用逗号自动格式化数字时如何保留预期的光标位置?