2012-05-17 6 views
15

나는 어떤 문제가 발생했는지에 대한 대안을 찾았는지 궁금했습니다. 사용자가 Facebook에 로그인하지 않은 경우 FB.init 중에 auth.statusChange가 실행되지 않습니다.

는 아래 코드의 예를 보자

<script> 
window.fbAsyncInit = function() { 
     FB.init({ 
      appId  : '[----removed-------]', // App ID 
      channelUrl : 'http://localhost/channel.html', // Channel File 
      status  : true, // check login status 
      cookie  : true, // enable cookies 
      xfbml  : true // parse XFBML 
     });  
     // Additional initialization code here 

     FB.Event.subscribe('auth.statusChange',fbLoginStatus); 

     console.log("getloginstatus"); 

     FB.getLoginStatus(fbLoginStatus); 
</script> 

true로 설정된 상태 FB.init를 사용하여, 본질적으로 facebook documentation에 따라 getLoginStatus()를 호출합니다. 그러나, apparently intended behaviour이 아니며, auth.statusChange이 기본값 인 'unknown', 이기 때문에 auth.statusChange 이벤트를 트리거합니다. '로그인하지 않음'의 값도 '알 수 없음'입니다.)

따라서 FB.getLoginStatus()에 과과 같이 상태를 true로 설정하여 전화를 걸어야 만 페이스 북에 로그인하지 않은 사용자에게 응답하고 싶습니다.

사용자가 "로그 아웃"이외의 다른 경우 함수가 두 번 호출되는 문제가 있습니다.

이런 일을 막기위한 좋은 방법이 있습니까? 나는 내 유일한 옵션은 인증 변경 이벤트를 처리하는 다른 함수를 호출 할 수있을 것 같아요 ..

+0

이상한 -이 버그가 제거 된 것 같습니다. 이 모든 일은 재앙입니다. 나는'status : true'가 실제로 유용 할 때를 알지 못한다. 그들은 이렇게 말합니다. 'FB에서 상태를 true로 설정하면.init() 호출을 사용하면 SDK는 init 이후 즉시 현재 사용자에 대한 정보를 얻으려고 시도합니다. 이렇게하면 Facebook 로그인을 사용하는 경우 로그인 한 사용자의 상태를 확인하는 데 걸리는 시간을 줄일 수 있지만 소셜 플러그인 만있는 페이지에는 유용하지 않습니다. ' 응답이 캐싱된다는 의미입니까? –

답변

14

내 가장 좋은 방법은 명시 적으로 getloginstatus 별도로 전화의 fb.init 옵션에서 '거짓'으로 상태를 설정하는 것이 었습니다.

IF get loginstatus가 알려지지 않은 상태 (즉, 로그 아웃 됨)로 되돌아 왔을 때, 상태 변경 이벤트를 구독하고 로그인 버튼을 표시하는 일반적인 작업을 수행했습니다. 그런 다음 사용자가 로그인하면 예상대로 상태가 변경됩니다.

+0

그들은 정말로 그렇게 단순해야만했던 것에서 큰 엉망진창을 만들었습니다. –

0

당신이 getLoginStatus의 진정한 매개 변수 통과 후에는 다시 얻을 응답을 확인할 수 있습니다

window.fbAsyncInit = function() { 
    FB.init({ 
     appId : '', 
     status : true, 
     cookie : true, 
     xfbml : true, 
    }); 

    FB.getLoginStatus(function(response) { 
     //console.log(response); 
     if (response.status === 'connected') { 
      var accessToken = response.authResponse.accessToken; 
      alert(accessToken); 
     } else if (response.status === 'not_authorized') { 
      //login function 
     } else { 
      //login function 
     } 
    }, true); 

    FB.Event.subscribe('auth.authResponseChange', function(response) { 
     //console.log('The status of the session changed to: '+response.status); 
     window.location.reload(); 
    }); 
}; 

하는 경우를 statustrue으로 설정하면 FB.getLoginStatus 응답 개체가 SDK에 의해 캐시되고 이후 FB.getLoginStatus을 호출하면이 캐시 된 응답에서 데이터가 반환됩니다.

이 문제를 해결하려면 두 번째 매개 변수를 true으로 설정하고 FB.getLoginStatus을 호출하여 페이스 북으로 왕복하여 강제적으로 응답 개체의 캐시를 새로 고쳐야합니다.

FB 문서 : 이것에 대한 https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

+4

캐싱은 위에서 설명한 문제가 아닙니다. fb.init에서 status = true로 설정하면 로그인 상태 검사가 강제 실행되어야하며 검사가 발생하면 상태 변경 이벤트가 트리거됩니다. –

+0

status = true가 캐시되므로 getLoginStatus()에 true 매개 변수가 필요합니다. – Philip

4

(자바 스크립트에 커피 스크립트,하지만 쉽게 번역) 다음과 같이 이론적으로 당신에게 왕복을 저장해야 더 나은 솔루션입니다 : 우리는 여전히 사용자가 알 수 없을 때 발생하는 수동 getLoginStatus을 사용하고

FB.init 
    appId: appId 
    channelUrl: channelUrl 
    status: true  # Check Facebook Login status on init 
    cookies: true 
    xfbml: false 

FB.getLoginStatus (response) => 
    @parseResponse(response) 
    FB.Event.subscribe 'auth.statusChange', @parseResponse 
    FB.Event.subscribe 'auth.authResponseChange', @parseResponse 

을, 그러나 이번에는 여전히 'status : true'를 사용하여 getLoginStatus가 호출 될 때 로그인 상태가 이미 캐시됩니다. getLoginStatus가 실행 된 후에 만 ​​관련 이벤트를 구독하면로드시 처리 메소드 parseResponse가 한 번 호출됩니다.

관련 문제