2017-11-03 17 views
0

私は反応ネイティブのFacebookログインエラーを処理する必要があります。二つのオプションを持つReactネイティブFB SDKハンドル認証拒否

"Facebook. Application would like to access your basic profile info and list of friends."

:新鮮な私のアプリケーションのインストール後にログインしようとすると

は、ユーザーにポップアップを示し、「OK」「許可しない」と。通常のフローでは、私は適切なトークンを取得します。それがキャンセルされた理由に関する情報がありません

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

:ユーザーがonLoginFinishedに拒否した場合しかし、私は次のような結果を得ます。拒絶は"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> 
     ) 
    } 
} 

'system_account'でキャンセルし、それが唯一の方法である、別途その振る舞いを扱う受けた後'native'ログイン動作への切り替えを行うことができますか?

答えて

2

Facebookのログインを使用する場合、対処すべき状況がいくつかあります。

  1. ユーザーのすべての権限を付与し、ユーザーは、いくつかの権限を付与し、
  2. ユーザー権限のいずれかを付与している場合
  3. ユーザーキャンセルログイン試行

ログインしていませんログインし

  • にログインLoginManager.logInWithReadPermissionsをチェックしてください。ネイティブコード(iOSの場合)FBSDKLoginManagerLoginResult(iOS SDKの場合) documentation of iOS SDKisCancelledは、「ログインがユーザーによってキャンセルされたかどうか」を示すBOOLです。

    戻り値isCanceledがtrueの場合、ユーザーは手動でログイン要求をキャンセルすることになります。これは、ユーザがあなたの気持ちを変えたりボタンを誤ってクリックしたり、あなたが尋ねた権限のリストを見たときに気が変わっただけなのかもしれません。isCanceledの値あなたがfacebookでログインしたくないと仮定して、(別のログイン方法にリダイレクトするか、ユーザーがログインするなどのポップアップを表示する)のように進むことができます。

    ユーザーがFacebookのログインを完了したが誕生日や好きなような許可要求のチェックを外した場合、アクセス許可はdeclinedPermissionsに表示されます。このプロパティのlenghtをチェックして、あなたが望むように進めることができます。いずれかの権限が拒否されたときに表示する必要があるすべてのエラーメッセージを保持するオブジェクトを作成できます。

    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()) 
         }) 
        } 
    } 
    
  • 関連する問題