Javascript 反应本机FB SDK句柄身份验证拒绝
我需要在react native中处理Facebook登录错误 在重新安装我的应用程序后尝试登录时,会向用户显示弹出窗口: “Facebook。应用程序希望访问您的基本个人资料信息 和朋友名单。” 有两个选项:“不允许”和“确定”。在正常流量下,我得到一个适当的令牌。但是如果用户在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
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登录时,有两种情况需要处理
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登录时,有两种情况需要处理
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())
})
}
}