Как синхронизировать приложение флеш facebook с серверами фейсбук

Я использую as3-fb-api, который подключается к js-api для flash-приложения. все работает нормально: войдите, получите фото профиля друзей, выйдите из системы, повторите.

НО, если пользователь открывает вторую вкладку браузера, указанную на facebook.com, и использует ее для выхода из Facebook, затем возвращается в мое приложение и нажимает кнопку выхода, которая вызывает Facebook.logout(), проблемы начинаются.

мое приложение слушает:

Facebook.addJSEventListener( 'auth.statusChange'       , om__statusChange       ) ;
Facebook.addJSEventListener( 'auth.authResponseChange' , om__authResponseChange ) ;
Facebook.addJSEventListener( 'auth.login'              , om__login_noticed      ) ;
Facebook.addJSEventListener( 'auth.logout'             , om__logout_noticed     ) ;

В идеале я ожидал бы, что Facebook.logout () будет вызывать js, который будет ajax fb-серверы, чтобы обнаружить, что пользователь уже вышел, и вернуть сообщение для обработки приложением.

В моем отладчике firebug я вижу, что вызывается функция facebookjsbridge: logout, но ее обратный вызов, FBAS.handleUserLogout, не вызывается, и ни один из обработчиков событий также не вызывается.

Итак, как правильно синхронизировать мое приложение с серверами?

1 ответ

Решение

После нескольких дней попыток использовать различные техники, это то, что я придумал, НО ЭТО ХАКШ

проблема заключалась в том, что если пользователь вошел в мое приложение Facebook через as3-fb-api:Facebook.login(...), а затем перешел на другую вкладку браузера, открыл там facebook.com, вышел из системы и затем вернулся к мое приложение и портит его, мое приложение не синхронизировано с Facebook.

Таким образом, чтобы решить эту проблему, у меня теперь есть все вызовы Facebook.api, чтобы найти эту ошибку:

{ error , [object Object] , object
    { code , 190 , number
      message , Error validating access token: The session is invalid because the user logged out. , string
      type , OAuthException , string
      error_subcode , 467 , number          
     }
}
// I may discover later that there are other types of failures 
//    that I will need to catch as well.

Если какие-либо вызовы возвращаются с этой ошибкой, приложение перезагружается (я использую вызов внешнего интерфейса для js, чтобы обработать перезагрузку).

Кроме того, я добавил подпрограмму к кнопке LOGOUT, чтобы использовать эту систему. Первоначально, когда пользователь нажимал кнопку ВЫХОД, я просто вызывал Facebook.logout (...), но это не помогло, ЕСЛИ пользователь уже вышел из системы... Facebook.logout (...) даже не вызывает обратный вызов с сообщением об ошибке, поэтому у приложения нет средств для обнаружения проблемы несинхронизации.

Так что теперь, когда пользователь нажимает кнопку LOGOUT, приложение сначала вызывает Facebook.api("/me/", ...). ЗАЧЕМ? потому что этот вызов API вернет сообщение об ошибке (или сообщение об успехе), даже если пользователь вышел из системы через другую вкладку браузера. И если этот вызов API возвращает сообщение об ошибке / объект, то я перевожу приложение в фазу перезагрузки, в противном случае я продолжаю, как правило, с Facebook.logout (...)

Другие вопросы по тегам