在React Native中,无法从Facebook SDK获取电子邮件地址

4
我成功登录并获取了accessToken。我已经做了...
我尝试...
LoginManager.logInWithReadPermissions([
      'email',
      'public_profile',
      'user_likes',
    ])

然后这样做

LoginManager.logInWithPublishPermissions([
  'publish_actions',
]).then((result) => {
  if (result.isCancelled) {
    console.log('Login cancelled');
  } else {
    AccessToken.getCurrentAccessToken().then((data) => {
      const accessToken = data.accessToken;
      const responseInfoCallback = (error, result) => {
        if (error) {
          console.log(error);
          console.log('Error fetching data=', error.toString());
        } else {
          console.log('Success fetching data=', result.toString());
        }
      };
      const infoRequest = new GraphRequest(
        '/me',
        {
          accessToken,
          parameters: {
            fields: {
              string: 'email,name,first_name,middle_name,last_name',
            },
          },
        },
        responseInfoCallback,
      );
      new GraphRequestManager().addRequest(infoRequest).start();
    });
  }
});

'登录成功并获得了权限','电子邮件、公共个人资料' 和用户资料数据是

{ first_name: 'XXXXXX',
  name: 'XXXXXX YYYYY',
  last_name: 'YYYYYY',
  id: '1319989423636921696328130092' }

但是无法获取用户电子邮件地址,这里出了什么问题。 在应用程序中登录 Facebook 后如何获取电子邮件地址。


你在哪里要求用户授权以访问他们的电子邮件? - CBroe
你能获取姓名和其他详细信息吗? - Paras Watts
2个回答

8
这是我在我的项目中的做法,成功地获取电子邮件。
LoginManager.logInWithReadPermissions(['public_profile', 'email', 'user_friends']).then(
            (result) => {
                if (result.isCancelled) {
                    console.log('Login cancelled')
                } else {
                    AccessToken.getCurrentAccessToken().then(
                        (data) => {
                            this._fbHome();// Navigatin to next screen
                        }
                    )
                }
            },
            (error) => {
                console.log('Login fail with error: ' + error)
            }
        )

然后在导航到下一个屏幕后,我会提取用户数据。
const infoRequest = new GraphRequest(
        '/me?fields=name,email,picture.type(large)',
        null,
        this._responseInfoCallback
      );
      new GraphRequestManager().addRequest(infoRequest).start();


_responseInfoCallback = (error, result) => {
    if (error) {
      alert('Error fetching data: ' + error.toString());
    } else {
      this.setState({ userName: result.name, userEmail: result.email ,userPic:result.picture.data.url});
              AsyncStorage.setItem("UserName",this.state.userName);
                    AsyncStorage.setItem("Email", this.state.userEmail);
                    AsyncStorage.setItem("UserPic", this.state.userPic);

      //  SharedPreferences.setItem("UserName", this.state.userName);
      //       SharedPreferences.setItem("Email", this.state.userEmail);
      //       SharedPreferences.setItem("UserPic", this.state.userPic);
      console.log("Picture"+ this.state.userPic + "Name" + this.state.userName + "Email" + this.state.userEmail);
    }
  }

{id: "1319989428136686664730092", picture: Object, name: "dddddddd"} id: "1319989428136686664730092" name:"ddddddd" picture:Object data:Object is_silhouette :falseurl : "https://scontent.xx.fbcdn.ne - Sport
你试过我的方法了吗? - Paras Watts
已经让它正常运行了,登录时遇到的那个账户问题解决了,另一个账户可以使用。谢谢。 - Sport
1
有时候用户只有 Facebook 邮箱 ID,比如像 someone@facebook.com 这样的邮箱,这种情况下邮箱 ID 也会为空。 - Paras Watts
logInWithReadPermissions 方法不再支持。 - Ali Akram

4

更新 在用户通过身份验证时,您可以设置权限,例如以下代码:

LoginManager.logInWithReadPermissions(['public_profile', 'email'])
        .then(function (result) {
            if (!result.isCancelled) {
                return AccessToken.getCurrentAccessToken().then((data) => {
                    return initUser(data).then((user) => {
                        return {
                            name: user.name,
                            email: user.email,
                            photo: 'https://graph.facebook.com/' + user.id + '/picture?type=normal'
                        }
                    })
                })
            }
        }).then((data) => {
            this._navigateTo(this.props, data, 'Home')
        })

将您的电子邮件设置在权限中,以便您的代码可以查看。
LoginManager.logInWithPublishPermissions(['public_profile', 'email']).then((result) => {
  if (result.isCancelled) {
    console.log('Login cancelled');
  } else {
    AccessToken.getCurrentAccessToken().then((data) => {
      const accessToken = data.accessToken;
      const responseInfoCallback = (error, result) => {
        if (error) {
          console.log(error);
          console.log('Error fetching data=', error.toString());
        } else {
          console.log('Success fetching data=', result.toString());
        }
      };
      const infoRequest = new GraphRequest(
        '/me',
        {
          accessToken,
          parameters: {
            fields: {
              string: 'email,name,first_name,middle_name,last_name',
            },
          },
        },
        responseInfoCallback,
      );
      new GraphRequestManager().addRequest(infoRequest).start();
    });
  }
});

这里的initUser是什么意思? - Sport
这是一个调用API以获取用户数据的函数。函数名为initUser(token) { return fetch('https://graph.facebook.com/v2.5/me?fields=email,name,friends&access_token=' + token.accessToken) .then(response => response.json()) } 导出 { initUser }。 - Martin Chinome
在哪里定义这个? - Sport
ReferenceError: initUser未定义 - Sport
在我的代码中,文件login.js中导入了FBSDK和{ LoginManager, AccessToken } from 'react-native-fbsdk'。 - Martin Chinome
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接