Google登录申请contacts.readonly权限后一直显示加载无法正常生效
问题原因
- 敏感权限未完成前置配置:
https://www.googleapis.com/auth/contacts.readonly属于Google敏感权限范畴,测试阶段如果没有将测试账号加入Google Cloud OAuth同意屏幕的测试用户列表,或者正式上线阶段没有完成Google官方的敏感权限审核,授权流程会被系统拦截卡住,导致页面一直显示加载状态。 - 代码缺少异常捕获和边界处理:现有代码没有处理
signIn()方法可能抛出的各类异常,也没有兼容用户主动取消授权的场景,当权限校验失败、网络异常、用户取消授权时,方法抛出异常后无后续处理逻辑,前端就会一直停在加载状态。 - 依赖API未开启:联系人只读权限对应需要提前在Google Cloud控制台开启People API,未开启该API时权限校验会直接失败,触发「Google API无法正常运行」的报错。
- 基础配置不匹配:Firebase绑定的Google Cloud项目配置错误,比如Android端SHA1签名、包名和OAuth客户端ID配置不一致,iOS端bundle ID配置错误,也会导致授权流程卡住。
- 网络环境限制:运行设备的网络无法正常访问Google服务,也会导致授权流程无法推进。
修复方案
- 完成权限和API前置配置
- 进入Google Cloud对应项目的「API和服务」页面,搜索开启
People API,这是使用contacts.readonly权限的必要前提。 - 进入「OAuth同意屏幕」配置页:测试阶段将所有需要参与测试的Google账号添加到「测试用户」列表,不在列表内的账号无法使用敏感权限;正式上线阶段提交权限申请,完成Google官方的敏感权限审核后,即可面向所有用户开放该权限。
- 优化代码补充异常和边界处理
修改后的参考代码如下:
Future googleSignIn() async { try { final GoogleSignInAccount? googleUser = await GoogleSignIn( scopes: ['https://www.googleapis.com/auth/contacts.readonly']).signIn(); // 处理用户主动取消授权的场景 if (googleUser == null) { // 此处添加关闭加载弹窗、提示用户取消登录的业务逻辑 return; } final GoogleSignInAuthentication googleAuth = await googleUser.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); await FirebaseAuth.instance.signInWithCredential(credential); // 此处添加登录成功后的业务逻辑 } catch (e) { // 打印错误日志便于排查,同时关闭加载弹窗、给用户弹出失败提示 print('Google登录错误信息: $e'); // 此处添加登录失败的业务处理逻辑 } }
- 校验基础配置信息
确认Firebase项目绑定的Google Cloud项目配置正确,Android端的SHA1签名、包名和Google Cloud控制台OAuth客户端ID的配置完全一致,iOS端的bundle ID配置无误。 - 确认运行设备的网络可以正常访问Google服务。
内容的提问来源于stack exchange,提问作者Tanmay Mondal
相关产品推荐
相关产品推荐

