2017-11-03 13 views
0

반응 네이티브에서 Facebook 로그인 오류를 처리해야합니다.네이티브 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. 로그인 한 사용자와
  4. 사용자 취소 로그인 시도

하면 로그인 당신은 LoginManager.logInWithReadPermissions을 확인합니다. iOS SDK의 (iOS의 경우)FBSDKLoginManagerLoginResult을 사용합니다. documentation of iOS SDKisCancelled은 "사용자가 로그인을 취소했는지 여부"를 나타내는 BOOL입니다.

반환 된 결과가 isCanceled 인 경우 사용자가 수동으로 로그인 요청을 취소한다는 의미입니다. 이는 사용자가 마음을 바꾸거나 버튼을 잘못 클릭했거나 요청한 권한 목록을 볼 때 마음이 바뀌기 때문일 수 있습니다. isCanceled 값을 확인한 결과 가 true이면 사용자가 페이스 북으로 로그인하지 않으려 고하고 (다른 로그인 방법으로 리디렉션하거나 사용자가 로그인해야하는 팝업 등을 표시)을 진행할 수 있습니다..

사용자가 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()) 
     }) 
    } 
}