FB.api не работает при вызове сразу после FB.init

FB.api не работает при вызове сразу после FB.init. Вот фрагмент кода, который я использую:

window.fbAsyncInit = function() {
  FB.init({
    appId : window.APP_ID,
    status : true,
    cookie : true,
    oauth : true,
    channelUrl : window.MASTER_URL + "channel",
    frictionlessRequests : true
  });

  window.COMPANY.init();
};

(function() {
  var e = document.createElement('script');
  e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
  e.async = true;
  document.getElementById('fb-root').appendChild(e);
}());

А вот мои COMPANY.init() и COMPANY.fetchAllFriends():

friends: new Array(),

init : function() {
  // TODO

  COMPANY.fetchAllFriends();

  FB.Canvas.setSize($(document).height());
  FB.Canvas.setAutoGrow();
},    

fetchAllFriends : function() {
  FB.api('/me/friends', function(response) {
    if (!response || response.error) {
      return;
    }

    COMPANY.friends = new Array();
    $.each(response.data, function(index, value) {
      COMPANY.friends.push(value.id);
    });
  });
},

где в ответе fetchAllFriends содержится ошибка, в которой говорится: «Токен активного доступа должен использоваться для запроса информации о текущем пользователе». Я убедился (через отладчик браузера), что FB.init вызывается перед этим вызовом FB.api.

Любая помощь будет оценена!


person Martin Asenov    schedule 13.12.2011    source источник


Ответы (2)


Хорошо, я исправил свою проблему. Я изменил:

window.fbAsyncInit = function() {
  FB.init({
    appId : window.APP_ID,
    status : true,
    cookie : true,
    oauth : true,
    channelUrl : window.MASTER_URL + "channel",
    frictionlessRequests : true
  });

  window.COMPANY.init();
};

to:

window.fbAsyncInit = function() {
  FB.init({
    appId : window.APP_ID,
    status : true,
    cookie : true,
    oauth : true,
    channelUrl : window.MASTER_URL + "channel",
    frictionlessRequests : true
  });

  FB.Event.subscribe('auth.login', window.COMPANY.init);
};

на случай, если кто-то еще захочет знать. Я обнаружил, что FB JS SDK не сформировал пользовательский сеанс к моменту возврата FB.init, поэтому вам нужно подписаться на событие «auth.login» с помощью функции инициализации. Подробнее здесь

person Martin Asenov    schedule 14.12.2011

Похоже, вы не проверяете статус пользователя. Все, что вы делаете, это инициализируете Facebook, вы даже не знаете, вошел ли пользователь в Facebook или имеет учетную запись Facebook. Вам нужно вызвать FB.getLoginStatus и проверить, «подключены ли они». Если они не подключены, нет возможности получить токен доступа. Если они подключены, то вы получаете токен доступа.

person Brent Baisley    schedule 13.12.2011
comment
Спасибо, но это не объясняет, почему метод fetchAllFriends (как определено выше) отлично работает при вызове после загрузки страницы, без явного вызова FB.getLoginStatus или добавления токена в вызов... - person Martin Asenov; 13.12.2011
comment
Забыл упомянуть, что мое приложение встроено в страницу холста Facebook и находится за страницей отправки, которая аутентифицирует пользователя, поэтому во время вызова вышеуказанных методов гарантируется, что пользователь вошел в систему Facebook. - person Martin Asenov; 13.12.2011
comment
Я бы все же предложил вызвать getLoginStatus и поместить все, что вам нужно, в обратный вызов для этой функции. Это гарантирует, что все готово. Но если вы не хотите этого делать, я бы предложил использовать FB.Event.subscribe. Возможно подписка на auth.statusChange. Несмотря на то, что у вас есть страница рассылки, Facebook по-прежнему необходимо проверять статус пользователя. Facebook не знает, что была страница рассылки. - person Brent Baisley; 14.12.2011
comment
+1 за вашу попытку помочь мне :)) Хотя я вчера исправил проблему, и решение опубликовано выше. - person Martin Asenov; 14.12.2011