Facebook iOS SDK не будет открывать пользовательский интерфейс после изменения пароля пользователя (iOS 6)

В некотором контексте: пользователь ранее установил приложение, авторизованный FB, все отлично поработало, затем они изменили свой пароль FB (через facebook.com), удалили приложение и теперь переустановили его и запускают его для первого снова после переустановки.

Я вызываю [FBSession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler] с allowLoginUI: YES, а права на чтение - "email, user_about_me, user_birthday, user_interests, user_location".

FBSessionState Я получаю в completionHandler is FBSessionStateClosedLoginFailed. NSLog ошибки:

Ошибка домена = com.facebook.sdk Код = 2 "Операция не может быть завершена (ошибка com.facebook.sdk 2.)" UserInfo = 0x1cd68c00 {com.facebook.sdk: ErrorLoginFailedReason = com.facebook.sdk: ErrorLoginFailedReason, com.facebook.sdk: ErrorInnerErrorKey = Ошибка домена = com.apple.accounts Код = 7 "Сервер Facebook не смог выполнить этот запрос доступа: Ошибка проверки маркера доступа: сеанс был недействительным, поскольку пользователь сменил пароль." UserInfo = 0x1cd5b970 {NSLocalizedDescription = сервер Facebook не смог выполнить этот запрос доступа: ошибка проверки маркера доступа: сеанс был недействительным, поскольку пользователь изменил пароль.}}

Этот внутренний домен ошибки ACErrorDomain и код ошибки ACErrorPermissionDenied. Итак, как я могу позволить пользователю повторно авторизировать приложение?

Я снова попробовал вызов openActiveSessionWithReadPermissions, но он просто выводит ту же ошибку. Я также пробовал [FBSession.activeSession closeAndClearTokenInformation], но это ничего не делает (предположительно потому, что нет activeSession).

Ответ 1

Нажатие очень похожей ошибки с 3.2.1 Facebook SDK. В моем случае я попал в FBSessionStateOpen, но мне был предоставлен недействительный токен доступа. Как говорится в этом вопросе, нормальная информация closeAndClearTokenInformation и даже удаление приложения не исправляют ее. Единственный способ, с помощью которого я смог вернуться в этот сценарий, - это изменить пароль пользователя в установочном приложении. Так вот что я делаю.

// In my completion handler FBSessionStateOpen is called BUT an
// invalid accessToken was detected.

[session closeAndClearTokenInformation];
[FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, 
                                    NSError *error) 
  {
     if (result == ACAccountCredentialRenewResultFailed ||
         result == ACAccountCredentialRenewResultRejected)
     {
       [self showErrorMessage:NSLocalizedString(@"You may need to re-enter your Facebook password in the iPhone Settings App.\n", nil)];
     }
     else 
     {
        // attempt opening a session again  (after they have updated their account 
        // settings I end up here)

        [self facebookLogin];  // Performs openActiveSessionWithReadPermissions, 
                               // but this time around the token issued should be good.
     }
 }];

Это единственное прагматическое решение, которое я смог придумать.

Ответ 2

Я думаю, вам нужно получить новый токен доступа с таким кодом...

[FBSession.activeSession closeAndClearTokenInformation];
[[FBSession class] performSelector:@selector(renewSystemAuthorization)];
[FBSession openActiveSessionWithReadPermissions:nil
                               allowLoginUI:YES
                          completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

}