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.
Проблема заключается в том, что это приводит к тому, что функция вызывается дважды, если пользователь является чем-то другим, кроме "выведенным из системы".
Есть ли опрятный способ остановить это?
Я думаю, что мой единственный вариант может состоять в том, чтобы вызвать другую функцию для обработки событий смены изменений.
Ответы
Ответ 1
Моим лучшим решением для этого было установить статус "false" в параметрах fb.init, а затем явно вызвать getloginstatus отдельно.
ЕСЛИ get loginstatus вернулся как неизвестный (т.е. вышел из системы), я подписался на событие изменения статуса, а также выполнил обычное отображение кнопки входа. Затем, когда пользователь входит в систему, изменение статуса срабатывает, как ожидалось.
Ответ 2
Лучшее решение, которое теоретически должно сэкономить вам на обочине, выглядит следующим образом (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 вызывается только один раз при загрузке.
Ответ 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/