2010-10-29 8 views
4

Я хочу проверить разрешения зарегистрированного пользователя перед представлением имени iframe для запроса расширенных perms, но всплывающее окно iframe блокируется браузером (ff, chrome проверено). Я хочу избежать этого, и я вполне уверен в этом, потому что результаты js-функций «вложены» - мой умный ум ограничен, поэтому извините меня.Facebook JS SDK: проверить разрешения перед входом в систему PopUp

Я предполагаю, что если я смогу сохранить все в исходной функции без передачи результатов, браузеры все равно будут видеть, что login 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

YAY! Одна и та же проблемная проблема (ну, ни одна и та же проблема, но та же самая желаемая функциональность) меня очень беспокоила, но, наконец, после HOURS исследования по различным источникам я понял решение!

первый

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); 
});   
    } 
}); 

второй Ваше разрешение запрос всплывал заблокирован хромом по соображениям безопасности (Firefox позволяет другие браузеры просят разрешить или нет)

«Один всплывающих может быть разрешено только если его открыть из событие действия пользователя, такое как .onclick " Таким образом, вы можете прикрепить эту функцию к событию .onclick.

третье Мое решение для проверки, если пользователь имеет необходимые разрешения для использования приложение является:

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

requestPermisions proceedure 
} 

Эта функция проверяет, если пользователь подключен и дал разрешение на ваше приложение другим способом response.status = «unknown» возвращается.

сейчас ....

Всплывающее проблемный блок разрешения имеет 2 решения.

1-е решение = прикрепить функцию FB.login() к событию onclick кнопки.Ex.

 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 изменяет браузеры URL-адрес и нЕ iframe's url

// Этот URL-адрес специально создан для запроса perms для вашего приложения.Вы можете изменить права доступа и ваш 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 
}