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) {
}