Javascript 反应本机FB SDK句柄身份验证拒绝

Javascript 反应本机FB SDK句柄身份验证拒绝,javascript,ios,react-native,react-native-fbsdk,Javascript,Ios,React Native,React Native Fbsdk,我需要在react native中处理Facebook登录错误 在重新安装我的应用程序后尝试登录时,会向用户显示弹出窗口: “Facebook。应用程序希望访问您的基本个人资料信息 和朋友名单。” 有两个选项:“不允许”和“确定”。在正常流量下,我得到一个适当的令牌。但是如果用户在onloginfished中拒绝,我会得到以下结果: { "isCancelled": true, "grantedPermissions": null, "declinedPermissions": nu

我需要在react native中处理Facebook登录错误

在重新安装我的应用程序后尝试登录时,会向用户显示弹出窗口:

“Facebook。应用程序希望访问您的基本个人资料信息 和朋友名单。”

有两个选项:“不允许”和“确定”。在正常流量下,我得到一个适当的令牌。但是如果用户在
onloginfished
中拒绝,我会得到以下结果:

{
  "isCancelled": true,
  "grantedPermissions": null,
  "declinedPermissions": null
}
没有关于取消原因的信息。拒绝是否是获得
“isCancelled”的唯一原因:对于
“系统帐户”
,为true

之后,所有连续尝试使用
“系统\u帐户”
登录的操作立即失败,出现以下错误:

{
  "code": "FacebookSDK",
  "domain": "com.facebook.sdk.login",
  "framesToPop": 1,
  "nativeStackIOS": [...],
  "userInfo": {
    "NSLocalizedDescription": "Access has not been granted to the Facebook account. Verify device settings.",
    "com.facebook.sdk:FBSDKErrorLocalizedDescriptionKey": "Access has not been granted to the Facebook account. Verify device settings."
  }
}
它给我的错误,我可以显示给用户,但由于本地化,我无法可靠地解析它。因此,问题是如何可靠地检测用户何时未授予权限

我的守则如下:

import React from 'react'
import {AccessToken, LoginManager} from 'react-native-fbsdk'

class Login extends React.Component {
    login = ()=>{
        LoginManager.setLoginBehavior('system_account')
        LoginManager.logInWithReadPermissions()
            .then(this.onLoginFinished)
            .catch(this.onLoginError)
    }
    onLoginFinished = (result)=>{
        if(result.isCancelled) {
            //
        } else {
            AccessToken.getCurrentAccessToken().then((data)=>{
                this.props.onLogin(data.accessToken.toString())
            })
        }
    }
    onLoginError = (error)=>{
        // Want to handle this case but 
        //can only show a message to the user =(
    }
    render() {
        return (
            <View>
                <TouchableHighlight onPress={this.login}>
                    <View><Text>Facebook</Text></View>
                </TouchableHighlight>
            </View>
        )
    }
}
从“React”导入React
从“react native fbsdk”导入{AccessToken,LoginManager}
类登录扩展了React.Component{
登录=()=>{
LoginManager.setLoginBehavior('system\u account')
LoginManager.logInWithReadPermissions()的
。然后(此。仅登录完成)
.catch(此.onlogin错误)
}
onLoginFinished=(结果)=>{
如果(结果被取消){
//
}否则{
AccessToken.getCurrentAccessToken()。然后((数据)=>{
this.props.onLogin(data.accessToken.toString())
})
}
}
onLoginError=(错误)=>{
//想处理这个案子但是
//只能向用户显示消息=(
}
render(){
返回(
脸谱网
)
}
}

从我所能想到的,我只能在收到使用
'system\u account'
取消后切换到
'native'
登录行为,并单独处理其行为。这是唯一的方法吗?

使用facebook登录时,有两种情况需要处理

  • 用户已授予所有权限并已登录
  • 用户已授予某些权限并登录
  • 用户未被授予任何权限并已登录
  • 用户已取消登录尝试
  • 如果选中,它将使用iOS SDK中的本机代码(用于iOS)。在
    isCancelled
    中,是一个
    BOOL
    ,显示“用户是否已取消登录”

    因此,如果在您返回的结果中
    isCanceled
    为true,则表示用户手动取消了登录请求。这可能是因为用户改变了主意或错误单击了按钮,或者仅仅是因为他/她在看到您请求的权限列表等时改变了主意如果value为true,那么您可以假设用户不想登录facebook,您可以这样继续(重定向到另一个登录方法或显示用户应该登录的弹出窗口等)

    如果用户完成facebook登录,但未选中某些权限请求(如生日或喜好等)权限将显示在
    declinedPermissions
    中。您可以检查此属性的
    长度
    ,并根据需要继续操作。您可以创建一个对象,其中包含任何权限被拒绝时需要显示的所有错误消息

    示例

    const permissions = [
      {
        permissionName: 'user_likes',
        errorMessage: 'To give you better results we need your likes'
      },
      {
        permissionName: 'user_birthday',
        errorMessage: 'Would you like to receive a gift from us on your birthday?'
      },
      {
        permissionName: 'user_friends',
        errorMessage: 'We can\'t match you without knowing your friends'
      }
    ];
    
    
    
    // ....
    login = ()=>{
        LoginManager.setLoginBehavior('system_account')
        LoginManager.logInWithReadPermissions(permissions.map((permission) => (permission.permissionName)))
            .then(this.onLoginFinished)
            .catch(this.onLoginError)
    }
    
    onLoginFinished = (result)=>{
        if(result.isCancelled) {
            // user canceled login manually
        } else {
            if (result.declinedPermissions && result.declinedPermissions.lenght > 0) {
              // handle declined permissions
              result.declinedPermissions.forEach((declinedPermission) => {
                // match the declinedPermission with the permission object
              }
            } else {
              // user gave all the permissions
            }
            AccessToken.getCurrentAccessToken().then((data)=>{
                this.props.onLogin(data.accessToken.toString())
            })
        }
    }
    

    当使用facebook登录时,有两种情况需要处理

  • 用户已授予所有权限并已登录
  • 用户已授予某些权限并登录
  • 用户未被授予任何权限并已登录
  • 用户已取消登录尝试
  • 如果选中,它将使用iOS SDK中的本机代码(用于iOS)。在
    isCancelled
    中,是一个
    BOOL
    ,显示“用户是否已取消登录”

    因此,如果在您返回的结果中
    isCanceled
    为true,则表示用户手动取消了登录请求。这可能是因为用户改变了主意或错误单击了按钮,或者仅仅是因为他/她在看到您请求的权限列表等时改变了主意如果value为true,那么您可以假设用户不想登录facebook,您可以这样继续(重定向到另一个登录方法或显示用户应该登录的弹出窗口等)

    如果用户完成facebook登录,但未选中某些权限请求(如生日或喜好等)权限将显示在
    declinedPermissions
    中。您可以检查此属性的
    长度
    ,并根据需要继续操作。您可以创建一个对象,其中包含任何权限被拒绝时需要显示的所有错误消息

    示例

    const permissions = [
      {
        permissionName: 'user_likes',
        errorMessage: 'To give you better results we need your likes'
      },
      {
        permissionName: 'user_birthday',
        errorMessage: 'Would you like to receive a gift from us on your birthday?'
      },
      {
        permissionName: 'user_friends',
        errorMessage: 'We can\'t match you without knowing your friends'
      }
    ];
    
    
    
    // ....
    login = ()=>{
        LoginManager.setLoginBehavior('system_account')
        LoginManager.logInWithReadPermissions(permissions.map((permission) => (permission.permissionName)))
            .then(this.onLoginFinished)
            .catch(this.onLoginError)
    }
    
    onLoginFinished = (result)=>{
        if(result.isCancelled) {
            // user canceled login manually
        } else {
            if (result.declinedPermissions && result.declinedPermissions.lenght > 0) {
              // handle declined permissions
              result.declinedPermissions.forEach((declinedPermission) => {
                // match the declinedPermission with the permission object
              }
            } else {
              // user gave all the permissions
            }
            AccessToken.getCurrentAccessToken().then((data)=>{
                this.props.onLogin(data.accessToken.toString())
            })
        }
    }