Flutter通过Facebook登录获取用户位置返回null该如何解决
Flutter Facebook登录获取用户位置为空解决方案
常见原因及修复步骤
1. 权限未通过Facebook平台审核
user_location属于Facebook的高级权限,仅申请配置是无效的,需要在Facebook开发者后台提交应用资质、使用场景说明等材料进行审核,审核通过后普通用户授权时才会返回位置数据。未审核通过前,仅应用的管理员、开发者、测试用户账号可以正常拿到位置信息。
2. 用户账号未公开位置信息
如果用户的Facebook个人资料中未填写位置,或者将位置信息的可见范围设置为非公开,接口会直接返回null,该场景属于用户隐私设置限制,无法通过代码修改解决。
3. 授权时用户拒绝了位置权限
Facebook登录过程中用户可以单独拒绝某一项权限申请,即使你在登录参数中配置了user_location,如果用户主动拒绝,也无法拿到对应数据。需要在登录后增加权限校验逻辑,判断用户是否真的授予了位置权限。
4. Graph API版本过旧
你当前使用的v2.12版本的Graph API已经停止服务,旧版本的字段返回逻辑存在异常,需要将请求URL中的版本替换为当前仍在支持周期内的稳定版本,例如v18.0。
5. 代码逻辑顺序错误
你当前的代码是先调用Graph API拉取用户信息,再判断登录状态是否成功,如果登录失败token无效,接口返回的数据结构会异常,需要将拉取用户信息的逻辑移到登录成功的判断分支内。
修复后的参考代码
void _signInFacebook() async { FacebookLogin facebookLogin = FacebookLogin(); // 申请权限 final result = await facebookLogin.logIn(['email', 'public_profile', 'user_birthday', 'user_location']); if (result.status == FacebookLoginStatus.loggedIn) { // 先校验是否获取到了位置权限 final grantedPermissions = await facebookLogin.permissions; if(!grantedPermissions.contains('user_location')){ print('用户未授予位置权限,无法获取位置信息'); return; } final token = result.accessToken.token; // 替换为高版本Graph API final graphResponse = await http.get('https://graph.facebook.com/v18.0/me?fields=name,first_name,last_name,birthday,location,email&access_token=${token}'); final profile = json.decode(graphResponse.body); print(profile['location']); // 此时可正常打印位置信息 var fb_ID = profile["id"]; var accessToken = token; final credential = FacebookAuthProvider.getCredential(accessToken: token); _auth.signInWithCredential(credential); // 连接MongoDB的原有逻辑 AuthService().facebookLogin(fb_ID, accessToken).then((val) { if (val.data['success']) { var token2 = val.data['token']; AuthService().getInfo(token2).then((val) async { var store = val.data['user']; }, ); } else { print('WRONG EMAIL/ PASS'); return; } }); } }
内容的提问来源于stack exchange,提问作者nit21
相关产品推荐
相关产品推荐

