2010-10-29 65 views
4

我想在呈現iframe登錄請求擴展perms之前檢查登錄用戶的權限,但iframe彈出被瀏覽器阻止(ff,chrome測試)。我想避免這種情況,我很確定它是因爲js函數的結果是'嵌套'的 - 我的js聰明是有限的,所以請原諒。Facebook JS SDK:在登錄PopUp之前檢查權限

我在猜測,如果我可以保留原始函數中的所有內容而不會傳遞結果,那麼瀏覽器仍然會將登錄iframe視爲「用戶啓動」並且不會阻止。

但我無法做到這一點 - 例如爲什麼下面的結果是data = undefined。

var data = FB.api(
{ 
method: 'fql.query', 
query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid 
}); 
alert(data); // = undefined 

我滿當前的代碼是:

<button id="myButton" >Test Publish Event</button> 

<script> 

$('#myButton').bind('click', function() { 

FB.getLoginStatus(function(response) { 

if (response.session) { 
// logged in and connected user, someone you know 

FB.api(
    { 
    method: 'fql.query', 
    query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid 
    }, 
    function(response) { 
     if(response[0].create_event == 1) { 
       alert('permission granted'); 
     } else { 
      alert('permission absent'); 

    FB.login( function(response) {if (response.session) { 
     handleSessionResponse(response); 
     if (response.perms) { 
      // user is logged in and granted some permissions. 
      // perms is a comma separated list of granted permissions 
      alert(response.perms); 
      } else { 
      // user is logged in, but did not grant any permissions  
     } 
     } else { 
     // user is not logged in 
     } 
    }, {perms:'create_event,rsvp_event'}); 

    } 
    } 
); 
</script> 

回答

8

耶!同樣的問題問題(以及沒有相同的問題,但相同的期望的功能)困擾了我很多,但最終在研究小時後,我找到了解決方案!

var data = FB.api(

這是錯誤的!由於所有的fb請求都是異步執行的,並且檢索數據值的唯一方法是在執行完該請求之後。前

FB.api(
{ 
method: 'fql.query', 
query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid 
},function(response){ 
This function will run after the request is finished and ONLY inside here you can read the results data 
ex alert(response.data); 
});   
    } 
}); 

第二你的許可請求的彈出是由鉻出於安全原因(火狐允許它的其他瀏覽器的要求,允許或不能)

「一個彈出只能如果從打開允許封鎖用戶操作事件,如.onclick「 因此,您可以將該功能附加到允許的.onclick事件。

3我檢查用戶是否具有所需的權限來使用你的應用程序的解決方案是:

FB.getLoginStatus(function(response) { 
if (response.status.toString().indexOf("connected")>-1) { 
    initAll(); 
    } else { 

requestPermisions proceedure 
} 

此功能檢查,如果用戶連接並給予權限以您的應用程序等方式response.status =返回「未知」。

現在....

的許可彈出塊問題有2個解決方案。

1st solution =將FB.login()函數附加到button.Ex的onclick事件。

 ifUserNotgrandedPermisions{document.getElementByid("aLogInButton").onclick = function(){ 
FB.login(....blah blah blah); 
}; 

第二個解決方案和一個我實現被重定向的iFrame,以請求許可頁面,而不是彈出

下面是一個完整的解決方案,來檢查,如果用戶登錄並授予燙髮。 ..如果不是它要求登錄用戶,然後請求權限(如果登錄就問燙髮)(如果有燙髮只需登錄)

FB.init({appId: 'YourAPPID', status: true, cookie: true, xfbml: true, oauth : true}); 
    FB.getLoginStatus(function(response) { 
    if (response.status.toString().indexOf("connected")>-1) { 
    initAll(); //User is connected and granted perms Good to go! 
    } else { 

//top.location改變瀏覽器的網址,而不是iframe的網址

//此網址專門爲您的應用程序提供燙髮。您更改權限和你的appid

// REDIRECT_URI =更改爲您的應用程序的畫布頁面

  top.location=window.location="http://www.facebook.com/dialog/oauth/?scope=read_stream,publish_stream,friends_photos,friends_activities&client_id="yourAPPID(nobrackets)"&redirect_uri=http://apps.facebook.com/filtered_feed/&response_type=code";}});}; 
1
FB.init({ 
    appId: 'YOUR APP ID', 
    status: true, 
    cookie: true, 
    xfbml: true, 
    oauth : true 
}); 
FB.getLoginStatus(function(response) { 
    if (response.status === 'connected') { 
    /*var uid = response.authResponse.userID; //FACEBOOK_ID 
    var accessToken = response.authResponse.accessToken;*/ //ACCESS TOKEN 
    FB.Canvas.setAutoResize(); 
    if (response.authResponse) { 
     // logged in and connected user, someone you know. 
     // YOUR SUCCESS CODE HERE 
    } 
    }else { 
     attemptLogin(); 
    } 
}); 

函數來打開彈出登錄到Facebook和授權。

function attemptLogin(){ 
    FB.login(function(response) { 
     if (response.authResponse) { 
      login(); 
     } else { 
      //if user didn't logged in or didn't authorize your application 
     } 
    }, {scope: 'offline_access,publish_stream,manage_pages'}); //YOUR PERMISSION 
}