auth.statusChange не срабатывает во время FB.init, если пользователь не вошел в Facebook

Я задавался вопросом, нашел ли кто-нибудь обходной путь к поведению, которое я испытываю.

Возьмем пример приведенного ниже кода:

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

Использование FB.init со статусом true вызывает getLoginStatus() в соответствии с документацией facebook. Однако явно задумано, что это не вызовет событие auth.statusChange, поскольку по умолчанию значение «неизвестно», и значение для «не вошел в систему» ​​также является «неизвестным» (даже если оно может быть известно!!)

Поэтому мне пришлось сделать вызов FB.getLoginStatus() явным образом, а также с установленным статусом true, если я хочу также отвечать пользователям, которые не вошли в facebook.

Проблема в том, что это приводит к тому, что функция вызывается дважды, если пользователь не "вышел из системы".

Есть ли аккуратный способ остановить это? Я думаю, что моим единственным вариантом может быть вызов другой функции для обработки событий изменения аутентификации.


person Ed_    schedule 17.05.2012    source источник
comment
странно - этот баг вроде убрали. все это катастрофа. Я не знаю, когда status:true действительно полезен. они говорят: «Если вы установите для статуса значение true в вызове FB.init(), SDK попытается получить информацию о текущем пользователе сразу после инициализации. Это может сократить время, необходимое для проверки состояния вошедшего в систему пользователя, если вы используете вход через Facebook, но бесполезно для страниц, на которых есть только социальные плагины». значит ли это, что ответ кэшируется?   -  person Simon_Weaver    schedule 26.05.2015


Ответы (3)


Моим лучшим решением для этого было установить статус «false» в параметрах fb.init, а затем явно вызвать getloginstatus отдельно.

ЕСЛИ get loginstatus вернулся как неизвестный (т. е. вышел из системы), я подписался на событие изменения статуса, а также сделал обычное отображение кнопки входа. Затем, когда пользователь входит в систему, изменение статуса срабатывает, как и ожидалось.

person Ed_    schedule 18.06.2012
comment
им действительно удалось сделать большой беспорядок из того, что должно было быть таким простым - person Simon_Weaver; 26.05.2015

Лучшее решение, которое теоретически должно сэкономить вам круговые поездки, выглядит следующим образом (coffeescript, но легко переводимый на 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

Мы по-прежнему используем ручной getLoginStatus для срабатывания, когда пользователь неизвестен, но на этот раз мы по-прежнему используем «status: true», чтобы статус входа в систему уже кэшировался при вызове getLoginStatus. Подписываясь на соответствующие события только после запуска getLoginStatus, мы гарантируем, что метод обработки parseResponse вызывается только один раз при загрузке.

person David Verhasselt    schedule 24.06.2013

Вы можете проверить ответ, который вы получите после того, как передадите истинный параметр в 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();
    });
};

Если вы установите для status значение true, объект ответа FB.getLoginStatus будет кэшироваться SDK, а последующие вызовы FB.getLoginStatus будут возвращать данные из этого кэшированного ответа.

Чтобы обойти это, вы должны вызвать FB.getLoginStatus со вторым параметром, установленным на true, чтобы принудительно выполнить обратную связь с Facebook, эффективно обновив кеш объекта ответа.

Документы FB: https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

person Philip    schedule 18.05.2012
comment
кэширование не было проблемой, которую я описал выше. Установка status = true в fb.init должна вызывать проверку состояния входа, а затем событие изменения состояния должно срабатывать, когда эта проверка происходит. - person Ed_; 19.06.2012
comment
status = true кэшируется, поэтому вам нужен параметр true в getLoginStatus(). - person Philip; 01.07.2012