2014-01-30 1 views
4

Я только что нашел эту проблему во время тестирования моего приложения, и это действительно начинает раздражать меня. Так что среда, как выглядит следующим образом:Facebook Login - если учетная запись пользователя присутствует (и приложение не установлено), вход завершается с ошибкой

  • Нет Facebook App не установлен
  • Пользователь регистрируется в IOS системы счета (В настройках -> Facebook)

Когда мое приложение пытается аутентифицировать пользователь в первый раз, он обеспечивает эту стену текста: (Я пытался очистками его немного)

2014-01-30 15:20:31.439 Unifeed[2140:70b] Session is <FBSession: 0xb74f9e0, state:   
FBSessionStateClosedLoginFailed, 
loginHandler: 0x0, appID: *************, urlSchemeSuffix: ,  
tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0xb73bd90>, 
expirationDate: (null),  
refreshDate: (null), attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(null)> 

2014-01-30 15:20:31.440 Unifeed[2140:70b] Session closed 
2014-01-30 15:20:31.440 Unifeed[2140:70b] User logged out 

2014-01-30 15:20:31.441 Unifeed[2140:70b] Error occured Error Domain=com.facebook.sdk Code=2  
"The operation couldn’t be completed. (com.facebook.sdk error 2.)" 
UserInfo=******** 
{com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:SystemLoginCancelled,  
com.facebook.sdk:ErrorInnerErrorKey=Error Domain=com.apple.accounts Code=7 "The operation 
couldn’t be completed. (com.apple.accounts error 7.)", 
com.facebook.sdk:ErrorSessionKey=<FBSession: 0xb74f9e0, state: FBSessionStateClosedLoginFailed, 
loginHandler: 0x0, appID: ************, urlSchemeSuffix: 
, tokenCachingStrategy:<FBSessionTokenCachingStrategy: 
0xb73bd90>, expirationDate: (null), refreshDate: (null), 
attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(null)>} 

2014-01-30 15:20:31.441 Unifeed[2140:70b] User cancelled login 
2014-01-30 15:20:31.445 Unifeed[2140:70b] User logged out 

Я знаю, Thats немного запутанным, но мой взгляд на него является его заблудшим из потому что он считает, что пользователь отменил процесс входа в систему. Дело в том, что я никогда не вижу маленького всплывающего окна, спрашивающего меня, хочу ли я войти в систему или принять разрешения ... Поэтому я добавил приложение Facebook на телефон, и он сработал ... ну это здорово, но что, если у меня есть пользователь с не App, но у них FB вошел в систему на телефоне .... У кого-нибудь есть идеи?

Мой код аутентификации выглядит следующим образом: (Довольно много только немного модифицирована с сайта FB)

- (void) facebookSessionChange { 
// If the session state is any of the two "open" states when the button is clicked 
if (FBSession.activeSession.state == FBSessionStateOpen 
    || FBSession.activeSession.state == FBSessionStateOpenTokenExtended) { 

    // Close the session and remove the access token from the cache 
    // The session state handler (in the app delegate) will be called automatically 
    [FBSession.activeSession closeAndClearTokenInformation]; 

    // If the session state is not any of the two "open" states when the button is clicked 
} else { 
    // Open a session showing the user the login UI 
    [FBSession openActiveSessionWithReadPermissions:permissions 
             allowLoginUI:YES 
            completionHandler: 
    ^(FBSession *session, FBSessionState state, NSError *error) { 
     [self sessionStateChanged:session state:state error:error]; 
    }]; 
} 
} 

- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error 
{ 

NSLog(@"Session is %@", session); 
// If the session was opened successfully 
if (!error && state == FBSessionStateOpen){ 
    NSLog(@"Session opened"); 
    // Show the user the logged-in UI 
    [self userLoggedIn]; 
    return; 
} 
if (state == FBSessionStateClosed || state == FBSessionStateClosedLoginFailed){ 
    // If the session is closed 
    NSLog(@"Session closed"); 
    // Show the user the logged-out UI 
    [self userLoggedOut]; 
} 

// Handle errors 
if (error){ 
    NSLog(@"Error occured %@", error); 
    if ([FBErrorUtility shouldNotifyUserForError:error] == YES){ 
     NSLog(@"Error occured %@", error); 
    } else { 

     // If the user cancelled login, do nothing 
     if ([FBErrorUtility errorCategoryForError:error] == FBErrorCategoryUserCancelled) { 
      NSLog(@"User cancelled login"); 

      // Handle session closures that happen outside of the app 
     } else if ([FBErrorUtility errorCategoryForError:error] == FBErrorCategoryAuthenticationReopenSession){ 
      NSLog(@"Session is no longer valid"); 

     } else { 
      //Get more error information from the error 
      NSDictionary *errorInformation = [[[error.userInfo objectForKey:@"com.facebook.sdk:ParsedJSONResponseKey"] objectForKey:@"body"] objectForKey:@"error"]; 
      NSLog(@"Error occured : %@", [errorInformation objectForKey:@"message"]); 
     } 
    } 
    // Clear this token 
    [FBSession.activeSession closeAndClearTokenInformation]; 
    // Show the user the logged-out UI 
    [self userLoggedOut]; 
} 
} 

// Show the user the logged-out UI 
- (void)userLoggedOut 
{ 
    NSLog(@"User logged out"); 
} 

// Show the user the logged-in UI 
- (void)userLoggedIn 
{ 
    NSLog(@"User Logged in"); 
    [_delegate doneLogginginToFb]; 
} 

Я попытался изменить способ, которым я аутентифицировать, но всегда работать в одной и той же проблемы ... Любые идеи ?

Благодаря

+0

Вы указали разрешение 'basic_info' в вашем массиве разрешений? – MAB

+0

Вы ставите!Он работает (аутентифицируется), если приложение FB присутствует, поэтому я считаю, что права правильные. – Andy

+0

Можете ли вы проверить настройки под фейсбукой, если ваше разрешение на использование отключено? – MAB

ответ

4

Я думаю, что я воспроизвести вашу ошибку здесь, ваше приложение было отказано в доступе к Facebook счета в настройках (по какой-то причине, может быть, вы нажали на «не позволяют» .. .) после того, как пользователь откажет в доступе или выключит коммутатор в настройках Facebook, приложение больше не будет запрашивать разрешение, и каждый раз, когда вы попытаетесь подключиться, он потерпит неудачу с состоянием FBErrorCategoryUserCancelled.

Чтобы исправить это, перейдите к Настройки> Общие> Сброс, а затем сброс местоположения & Конфиденциальность. После этого приложения вы должны будете увидеть приглашение с запросом на получение разрешений.

+0

Не работает. Должен ли я удалить приложение из своих настроек FB, а затем сбросить свое устройство (simluator)? Что делать, если это происходит в «реальном» контексте – Andy

+0

, когда вы отдыхаете местоположение и конфиденциальность, ваше приложение не должно находиться в настройках FB. – MAB

+0

Теперь я удалил приложение из своего FB, и я сбросил, как вы сказали -. Теперь он регистрирует меня в мгновенном журнале, ссылаясь на те же ошибки после успешного входа в систему, но теперь он также говорит об ошибке 400, пользователь не аутентифицировал приложение (что имеет смысл, я никогда не получал возможность). Также говорится, что сеанс более недействителен .... – Andy

2

У меня была такая же проблема, и это сводило меня с ума. Я был исправлен, обновив SDK Facebook до последней версии.

Не уверен, что это было проблемой для вас, но я надеюсь, что это поможет кому-то.

+0

серьезно, как это даже отдаленно приемлемая практика с их стороны? –

4

Перейти к Facebook разработчику> Ваше приложение> Настройки> Основные

Нажмите на + Добавить Платформа

Введите свой Bundle ID

Включите Single Sign On

Сохраните изменения.