При подключении учетной записи FB на устройстве к iOS6 происходит сбой авторизации на компьютере
Я использую die SDK 3.1.1 для реализации FB Connect в моем приложении iOS. Это прекрасно работает в простом случае с новой интеграцией FB (входит в систему на iOS) или возвращается к обычной авторизации через веб-представление (у меня нет встроенного приложения Facebook, установленного в обоих случаях).
Проблема возникает при переключении учетной записи на уровне iOS. Выход из системы и вход в систему с другой учетной записью пользователя FB.
Чтобы выполнить вход/авторизацию, выполните следующие действия:
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
Если затем получить FBSessionStateClosedLoginFailed каждый раз, даже если я выполняю closeAndClearTokenInformation
, когда это состояние достигнуто:
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
{
NSLog(@"Session State Changed: %u", [[FBSession activeSession] state]);
switch (state) {
case FBSessionStateOpen:
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
NSLog(@"FBSessionStateClosedLoginFailed ERROR: %@", [error description]);
[[FBSession activeSession] closeAndClearTokenInformation];
break;
default:
break;
}
Тем не менее, я получаю одно и то же состояние при каждой попытке. В моем журнале указано следующее:
FBSDKLog: FBSession **INVALID** transition from FBSessionStateCreated to FBSessionStateClosed
FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening
FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateClosedLoginFailed Session State Changed: 257
FBSessionStateClosedLoginFailed TOKEN: (null)
FBSessionStateClosedLoginFailed ERROR: Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)" UserInfo=0xb24cc20 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason}
Может ли кто-нибудь воспроизвести это или есть идея, где может возникнуть проблема?
Ответы
Ответ 1
Другой ответ дает возможность вручную повторно синхронизировать устройство с сервером. Для вызова этого кода я определил метод под названием fbRsync
. Обязательно #import <Accounts/Accounts.h>
в вашем файле реализации и затем определите этот метод:
-(void)fbResync
{
ACAccountStore *accountStore;
ACAccountType *accountTypeFB;
if ((accountStore = [[ACAccountStore alloc] init]) && (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){
NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
id account;
if (fbAccounts && [fbAccounts count] > 0 && (account = [fbAccounts objectAtIndex:0])){
[accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
//we don't actually need to inspect renewResult or error.
if (error){
}
}];
}
}
Затем я вызываю fbResync
, если openActiveSessionWithReadPermissions
дает ошибку:
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
if(error)
{
NSLog(@"Session error");
[self fbResync];
[NSThread sleepForTimeInterval:0.5]; //half a second
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
}
else
[self sessionStateChanged:session state:state error:error];
}];
Задержка в полсекунды, вероятно, не нужна, но в настоящее время она дает мне разум.
Это, похоже, решает проблему для меня. Теперь я могу переключаться между учетными записями Facebook и входить в систему. Yay!
Ответ 2
У меня была та же проблема. Убедитесь, что ваше приложение FB включено в настройках → Facebook.
Шахта была отключена (хотя я не помню ее отключения), и как только я включил ее, она была исправлена.
В моем тестовом процессе я добавил и удалил свое приложение FB несколько раз с моей учетной записи FB, которая связана с моим iPhone. Это может объяснить, почему, по волшебству, мое приложение было отключено.
Ответ 3
В ios 6 с fb sdk 3.1.1. Пожалуйста, передайте параметр разрешений как "nil или email" в методе "[FBSessio openActiveSessionWithReadPermissions...". Здесь мой код работал отлично.
#define IOS_NEWER_OR_EQUAL_TO_6 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 6.0 )
-(void)showFBLogin
{
[FBSession.activeSession closeAndClearTokenInformation];
NSArray *permissions = [NSArray arrayWithObjects:@"email, publish_actions, publish_stream", nil];
#ifdef IOS_NEWER_OR_EQUAL_TO_6
permissions = nil; or NSArray *permissions = [NSArray arrayWithObjects:@"email",nil];
#endif
NSLog(@"\npermissions = %@", permissions);
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:
^(FBSession *session,
FBSessionState state, NSError *error) {
NSLog(@"\nfb sdk error = %@", error);
switch (state) {
case FBSessionStateOpen:
[[FBRequest requestForMe] startWithCompletionHandler:
^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if (!error) {
//success
}
}];
break;
case FBSessionStateClosed:
//need to handle
break;
case FBSessionStateClosedLoginFailed:
//need to handle
break;
default:
break;
}
}];
}
Ответ 4
У меня такая же проблема для 3.1.3 FB SDK с iOS7.1. И я нахожу решение здесь. Надеюсь, что это поможет!
Я попробовал все ответы здесь.
@loganathan nil permissions, @ill_always_be_a_warriors fbResync.
Все это не работает для меня.
Но я обнаружил, что это будет хорошо работать, когда я запускаю тот же код в iPhone 7.1 симулятор
(без единого входа "Единый вход" )
Тот же код хорошо работает на старой версии iOS FB SDK (не уверен, какая версия, но не 3.13)
(но SSO не покажет при попытке входа в систему)
Итак, я пытаюсь переписать проблему с образцом. Здесь я нашел несколько разных вариантов.
1. https://developers.facebook.com/docs/ios/getting-started Добавить новое имя FacebookDisplayName
2. Я изменяю свой BundleID для подключения iTune, но я не обновляю его до Faceboook App Dev
После изменения этих настроек он работает в моем приложении iOS с функцией SSO.
Надеюсь, что это поможет!
Ответ 5
Вы попробовали методы RenewSystemCredential? Взгляните на это сообщение:
Facebook iOS SDK extendAccessToken не работает - fbDidExtendToken не вызывается
Ответ 6
Я получил ту же ошибку. Но я использовал метод @ill_always_be_a_warriors: -(void)fbResync
, но не работает для меня.
Наконец-то я нашел свою проблему с разрешениями, я удалил разрешение offline_access
, он работает, надеюсь, что это поможет кому-то.