Подтвердить что ты не робот

При подключении учетной записи 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}

Может ли кто-нибудь воспроизвести это или есть идея, где может возникнуть проблема?

4b9b3361

Ответ 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.
Надеюсь, что это поможет!

Ответ 6

Я получил ту же ошибку. Но я использовал метод @ill_always_be_a_warriors: -(void)fbResync, но не работает для меня.

Наконец-то я нашел свою проблему с разрешениями, я удалил разрешение offline_access, он работает, надеюсь, что это поможет кому-то.