React Native FB SDK处理身份验证拒绝

时间:2017-11-03 23:45:47

标签: javascript ios react-native react-native-fbsdk

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

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

  

"使用Facebook。应用程序想要访问您的基本个人资料信息   和朋友列表。"

有两个选项:"不允许"和"好的"。在正常流量下,我得到一个合适的令牌。但是如果用户拒绝onLoginFinished我得到以下结果:

{
  "isCancelled": true,
  "grantedPermissions": null,
  "declinedPermissions": null
}

哪个没有关于它被取消的原因的信息。拒绝是使用"isCancelled": true获取'system_account'的唯一理由吗?

之后,所有连续尝试使用'system_account'登录的操作都会立即失败并显示以下错误:

{
  "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>
        )
    }
}

从我能想到的情况来看,我只能在收到'native'取消后切换到'system_account'登录行为,并且单独处理它的行为是唯一的方法吗?

1 个答案:

答案 0 :(得分:2)

使用Facebook登录时,有几种情况需要处理。

  1. 用户授予所有权限并登录
  2. 用户授予了一些权限并登录
  3. 用户未被授予任何权限并已登录
  4. 用户取消登录尝试
  5. 如果您检查LoginManager.logInWithReadPermissions它使用来自iOS SDK的本机代码(适用于iOS) FBSDKLoginManagerLoginResult。在documentation of iOS SDK isCancelled中有BOOL,其中显示“用户是否取消了登录信息。”

    因此,如果返回的结果isCanceled为真,则表示用户手动取消了登录请求。这可能是因为用户改变了主意或错误地点击了某个按钮,或者只是因为当他/她看到您要求的权限列表时他改变了主意。当您检查并看到{{ 1}}值为true然后您可以假设用户不想使用facebook登录,您可以像那样继续(重定向到另一个登录方法或显示用户应该登录的弹出窗口等)。

    如果用户完成了Facebook登录但未选中某些权限请求(如生日或喜欢等),则权限将显示在isCanceled中。您可以查看此属性的declinedPermissions并按照您的意愿继续操作。您可以创建一个对象,其中包含在任何权限下降时需要显示的所有错误消息。

    示例

    lenght