2012-05-17 39 views
15

Tôi tự hỏi liệu có ai đã tìm thấy cách giải quyết cho hành vi mà tôi đang gặp phải hay không.auth.statusChange không kích hoạt trong FB.init nếu người dùng không đăng nhập vào facebook

Hãy ví dụ của mã dưới đây:

<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> 

Sử dụng FB.init với tình trạng thiết lập là true, về cơ bản gọi getLoginStatus() theo facebook documentation. Tuy nhiên, đó là apparently intended behaviour rằng điều này sẽ không kích hoạt sự kiện auth.statusChange, bởi vì giá trị mặc định là 'không xác định', giá trị cho 'chưa đăng nhập' cũng 'không xác định' (mặc dù nó có thể được biết !!)

Vì vậy, tôi đã phải thực hiện cuộc gọi đến FB.getLoginStatus() rõ ràng cũng như có trạng thái được đặt thành true nếu tôi cũng muốn trả lời người dùng không đăng nhập vào facebook.

Vấn đề là, điều này dẫn đến chức năng được gọi hai lần nếu người dùng là bất cứ điều gì khác hơn là "đăng xuất".

Có cách nào ngăn chặn điều này không? Tôi nghĩ rằng lựa chọn duy nhất của tôi có thể gọi một chức năng khác nhau để xử lý auth sự kiện thay đổi ..

+0

lạ - lỗi này dường như đã bị xóa. toàn bộ điều này là một thảm họa. Tôi không có manh mối nào khi 'trạng thái: true' thực sự hữu ích. họ nói: 'Nếu bạn đặt trạng thái thành true trong FB.init() gọi, SDK sẽ cố gắng để có được thông tin về người dùng hiện tại ngay sau khi init. Làm như vậy có thể giảm thời gian để kiểm tra trạng thái của người dùng đã đăng nhập nếu bạn đang sử dụng Đăng nhập Facebook, nhưng không hữu ích cho các trang chỉ có các plugin xã hội trên chúng. ' vậy điều này có nghĩa là phản hồi được lưu trong bộ nhớ cache? –

Trả lời

14

giải pháp tốt nhất của tôi cho điều này là để thiết lập trạng thái để 'false' trong các tùy chọn FB.init, sau đó gọi một cách rõ ràng getloginstatus riêng.

NẾU nhận loginstatus trở lại là không xác định (tức là đã đăng xuất), tôi đã đăng ký sự kiện thay đổi trạng thái cũng như thực hiện thường lệ hiển thị nút đăng nhập. Sau đó, khi người dùng đăng nhập, thay đổi trạng thái kích hoạt như mong đợi.

+0

họ thực sự đã xoay xở để tạo ra một mớ hỗn độn lớn từ một thứ gì đó đáng lẽ phải rất đơn giản –

0

Bạn có thể kiểm tra phản ứng bạn nhận được trở lại sau khi bạn vượt qua một tham số đúng trong 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(); 
    }); 
}; 

Nếu bạn đặt status thành true, đối tượng phản hồi FB.getLoginStatus sẽ được bộ nhớ cache của SDK và các cuộc gọi tiếp theo tới FB.getLoginStatus sẽ trả về dữ liệu từ phản hồi được lưu trong bộ nhớ cache này.

Để giải quyết vấn đề này, bạn phải gọi FB.getLoginStatus với tham số thứ hai được đặt thành true để buộc một vòng tới Facebook - làm mới hiệu quả bộ nhớ cache của đối tượng phản hồi.

FB Documents: https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

+4

bộ nhớ đệm không phải là vấn đề tôi đã mô tả ở trên. Trạng thái cài đặt = true trong fb.init sẽ buộc kiểm tra trạng thái đăng nhập, khi đó sự kiện thay đổi trạng thái sẽ kích hoạt khi kiểm tra đó xảy ra. –

+0

status = true được lưu trữ, vì lý do này bạn cần tham số đúng trong getLoginStatus(). – Philip

4

Một giải pháp tốt hơn mà về mặt lý thuyết nên giúp bạn tiết kiệm roundtrips là như sau (coffeescript, nhưng dễ dàng thể dịch để javascript):

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 

Chúng tôi vẫn đang sử dụng một getLoginStatus sổ tay để bắn khi người dùng là không rõ, nhưng lần này chúng tôi vẫn sử dụng 'status: true' để trạng thái đăng nhập đã được lưu trong bộ nhớ cache khi getLoginStatus được gọi. Bằng cách đăng ký các sự kiện liên quan chỉ sau khi getLoginStatus đã kích hoạt, chúng tôi đảm bảo rằng phương thức xử lý parseResponse chỉ được gọi một lần khi tải.