Ios6 facebook интеграция логин всегда FBSessionStateClosedLoginFailed никогда не открывается - программирование
Подтвердить что ты не робот

Ios6 facebook интеграция логин всегда FBSessionStateClosedLoginFailed никогда не открывается

этот вопрос очень похож на Facebook SDK для iOS, на устройстве iOS 4.0, но, поскольку я не могу комментировать там, я открываю новый вопрос. Я думаю, что вопросы не совпадают:

При попытке обновить интеграцию facebook моего приложения с facebook 3.1 я не получаю сеанс facebook, чтобы открыть sessionStateChanged Callback всегда заканчивается в FBSessionStateClosedLoginFailed. в моей настройке у меня есть обратный вызов в моем appdelegate

- (BOOL)application:(UIApplication *)application 
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    // attempt to extract a token from the url
    //    return [self.session handleOpenURL:url]; 
    return [FBSession.activeSession handleOpenURL:url];
}

но он никогда не называется! не следует ли его вызвать? Я следил за документацией на facebook и звонил

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    NSArray *permissions = [NSArray arrayWithObjects:@"publish_actions", nil];
    return [FBSession openActiveSessionWithPublishPermissions:permissions
                                              defaultAudience:FBSessionDefaultAudienceFriends
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session,
                                                             FBSessionState state,
                                                             NSError *error) {
                                             [self sessionStateChanged:session
                                                                 state:state
                                                                 error:error];
                                         }];
}

Я также пробовал

openActiveSessionWithReadPermissions с nil для разрешений, как в примере с учебником для facebook, с целью позже повторного авторизации для разрешения publish_actions. тот же результат: FBSessionStateClosedLoginFailed снова.

Я даже пробовал звонить

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

                }
            }];
        }
    }

прежде чем пытаться открыть сеанс, но я никогда не открываю его на своем устройстве ios6 (iphone 4s). в приложении меня просят разрешения, но потом ничего не происходит, потому что сессия всегда имеет состояние FBSessionStateClosedLoginFailed! мой обратный вызов для состояния сеанса

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if (!error) {
                // We have a valid session
                NSLog(@"User session found");
            }
            break;
        case FBSessionStateClosed:
            NSLog(@"FBSessionStateClosed");
        case FBSessionStateClosedLoginFailed:
            NSLog(@"FBSessionStateClosedLoginFailed");
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }

    [[NSNotificationCenter defaultCenter]
     postNotificationName:FBSessionStateChangedNotification
     object:session];

    if (error) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"facebook Hinweis"
                                                        message:@"facebook Login nicht möglich, bitte versuchen Sie es erneut."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        NSLog(@"Facebook session error: %@", error.localizedDescription);
    }
}

с facebook 3.0 на ios 5 У меня никогда не было проблемы, поэтому мое приложение facebook настроено правильно. Я был бы очень признателен за любую помощь, которая позволила бы мне просто открыть сеанс facebook, не думал, что столкнется с этими проблемами с facebook 3.1, и документы не помогут мне на этом этапе, спасибо

4b9b3361

Ответ 1

У меня была такая же проблема, и это было потому, что я забыл реализовать

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [FBSession.activeSession handleOpenURL:url];
}

в приложении AppDelegate

Ответ 2

В то время как ответ JohnG верен, данный метод делегата теперь устарел. Правильный метод делегирования для использования - это:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [FBSession.activeSession handleOpenURL:url];
}

Размещение этого делегата в моем приложении решило проблему для меня. Без этого, основной вход iOS 6.0 будет работать, но вход в приложение для входа в систему Facebook не удастся.

Ответ 3

У меня была та же проблема. Если у пользователя не было учетной записи Facebook, настроенной в Системных настройках, появился диалоговое окно входа в систему Facebook, и все было в порядке. Но если у пользователя была учетная запись, настроенная в устройстве, у меня всегда была ошибка FBSessionStateClosedLoginFailed.

Он не имеет ничего общего с handleOpenURL:url, потому что в "собственном потоке входа" для iOS 6 или выше нет быстрого изменения приложения. Поэтому ваше приложение никогда не переходит на задний план, и перенаправление URL-адреса не требуется.

Проблема была решена при настройке приложения Facebook. Вам нужно включить раздел "Native iOS login" и поместить идентификатор пакета вашего приложения. Если ваше приложение еще не в Apple Store, я боюсь, что вам нужно установить режим песочницы в положение ON. Как только ваше приложение опубликовано в Apple Store, я думаю, вам нужно отключить режим песочницы и установить идентификатор Apple Store в настройке Facebook.

Ответ 4

Даже я не могу прокомментировать, написав это как ответ. Я не уверен, позвольте мне проанализировать потенциальные причины 1) вы сказали: "Но это никогда не называется! Не следует ли его вызвать?" - для

- (BOOL)application:(UIApplication *)application 
        openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation

чтобы получить вызов, в файле info.plist должна быть установлена ​​правильная схема URL, т.е. перейти к URL-адресам → Item0 → Схемы URL --- > Item 0 значение здесь должно быть fbAPPID, то есть fb append with ваш фактический facebookappID [FacebookAppID также может присутствовать в файле info.plist или жестко закодирован в коде].

2) Вы сказали: "sessionStateChanged Callback всегда заканчивается в FBSessionStateClosedLoginFailed"

В методе switch sessionStateChanged проверьте состояние сеанса, и если он был создан или созданTokenLoaded, попробуйте открыть сеанс.

Примечание. [FBSession openActiveSessionWithPublishPermissions....], который является статическим методом, создаст новый сеанс и будет установлен в FBSession.activeSession, где openWithCompletionHandler - это метод экземпляра, который может работать только в том случае, если сеанс уже создан.

    case FBSessionStateCreated:
    case FBSessionStateCreatedTokenLoaded:{
        [session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
            //handle the updating of views according to the sate of session 
        }];
        break;

Ответ 5

Я согласен с JohnG с дополнительной оговоркой:

Обратите внимание, что если у вас есть несколько случаев внутри handleOpenURL:, вы можете фильтровать для:

if ([sourceApplication isEqualToString:@"com.facebook.facebook"] ||
    [sourceApplication isEqualToString:@"com.facebook.Facebook"]){
  //Do Stuff
}

Это странно, но я смог воспроизвести на нескольких устройствах sourceApplication, возвращаясь как "Facebook" и "facebook".

Ответ 6

В FB SDK 3.5 вы можете убить токен следующим образом:

    [[FBSessionTokenCachingStrategy defaultInstance] clearToken];