用于Javascript的Facebook SDK,FB.login()回调未触发(异步调用永远不会得到响应?)

时间:2014-06-18 18:54:00

标签: javascript facebook facebook-graph-api facebook-javascript-sdk facebook-ads-api

以下代码是我的Facebook API javascript到目前为止。它非常简单,有一堆console.log()来跟随代码流。 (我认识到命名参数响应和响应2是一种可怕的做法,但它正是我现在迅速采取的措施,以避免命名冲突。)

目前,FB.init()成功,FB.getLoginStatus()有效,两个FB.api()调用有效,但FB.login()永远不会发生。它虽然是异步的,但执行之前和之后的console.log()都是。总而言之,我的控制台输出是:

  

在这里做到了   在这里也是如此   权限:   对象{data:Array [37]}   很高兴见到你,我的名字就在这里。

我想这是因为异步FB.login()调用永远不会得到响应所以回调永远不会触发,因此函数内部没有console.log()。但我需要此FB.login()才能获得扩展权限ads_management。知道出了什么问题,或至少是自己解决这个问题的方向吗?

window.fbAsyncInit = function() {

  FB.init({
    appId: 'my-app-id-is-here',
    xfbml: true,
    version: 'v2.0'
  });

  FB.getLoginStatus(function(response) {

    if (response.status === 'connected') {

      FB.api('/me', function(response2) {
        console.log("Good to see you, " + response2.name + ".");
      });

      FB.api('/me/permissions', function(response2) {
        console.log("Permissions:");
        console.log(response2);
      });

      console.log("makes it here");
      FB.login(function(response2) {
        console.log("why not here?");
        if (response2.authResponse) {
          console.log("Response to login asking for ads_management permission");
          console.log(response2);
        } else {
          console.log("User cancelled login or did not fully authorize.");
        }
      }, {
        scope: 'ads_management',
        return_scopes: true
      });
      console.log("makes it here too");

    } else {

      // filled with other code that doesn't effect this question yet

    }

  });
};

更新

取消参数参数{scope: 'ads_management', return_scopes: true}至少会尝试FB.login()调用,但在控制台中现在出现错误:

  

" FB.login()在用户已连接时调用。"

但我想通过再次调用FB.login()并使用参数参数中指定的所需权限,在用户已经登录IS时获得更多权限的方法。

2 个答案:

答案 0 :(得分:1)

您的流程不正确。首先检查FB.api("/me/permissions") 回调中的权限(因为facebook api调用是异步的),然后如果尚未授予该特定权限,则调用FB.login()。< / p>

你去吧 -

if (response.status === 'connected'){
    FB.api('/me/permissions', function(response){
        var hasPermission = false;
        var response = new Array();
        response = response.data;
        response.map(function (data) {
            if (data.permission == "ads_management" && "status" == "granted") {
               hasPermission = true;
            } 
        });
        if(!hasPermission)
            // call FB.login() here
    });
} 

答案 1 :(得分:0)

尝试在FB.init中使用oauth:true。

如果您在发布FB.login之前尚未获得所需权限,则应通过代码进行检查。