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() в соответствии сдокументация в фейсбуке, Тем не менее, этоочевидно, предполагаемое поведение что это будетnot вызвать событиеauth.statusChangeпотому что значением по умолчанию является «неизвестный»,and значение для "не вошло в систему" также является «неизвестным»; (хотя это может быть известно !!)

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

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

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

 Simon_Weaver26 мая 2015 г., 08:03
странно - эта ошибка, кажется, была удалена. все это катастрофа. Я остался без понятия о том, когдаstatus:true на самом деле полезно. они говорят: «Если вы установили состояние в true в вызове FB.init (), SDK попытается получить информацию о текущем пользователе сразу после init. Это может сократить время, необходимое для проверки состояния вошедшего в систему пользователя, если вы используете Facebook Login, но бесполезно для страниц, на которых есть только социальные плагины. значит ли это, что ответ кешируется?

Ответы на вопрос(3)

который вы получите после передачи истинного параметра в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 Docs:https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

 Ed Hinchliffe19 июн. 2012 г., 01:00
Кэширование не было проблемой, которую я описал выше. Установка status = true в fb.init должна вызвать проверку статуса входа в систему, тогда событие изменения статуса должно сработать, когда эта проверка произойдет.
 01 июл. 2012 г., 15:59
status = true кэшируется, поэтому вам нужен параметр true в getLoginStatus ().

которое теоретически должно спасти вас от обходов, заключается в следующем (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 для запуска, когда пользователь неизвестен, но на этот раз мы по-прежнему используем «статус: истина». так что статус входа уже кэшируется при вызове getLoginStatus. Подписываясь на соответствующие события только после запуска getLoginStatus, мы гарантируем, что метод обработки parseResponse вызывается только один раз при загрузке.

Решение Вопроса

в параметрах fb.init, чтобы явно вызывать getloginstatus отдельно.

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

 26 мая 2015 г., 05:26
им действительно удалось сделать большой беспорядок из чего-то, что должно было быть настолько простым

Ваш ответ на вопрос