Вход в Facebook - если учетная запись пользователя присутствует (и приложение не установлено), вход в систему невозможен.

Я только что обнаружил эту проблему во время тестирования своего приложения, и это действительно начинает меня раздражать. Итак, окружение выглядит следующим образом:

  • Приложение Facebook не установлено
  • Пользователь вошел в системную учетную запись 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

Я знаю, что это немного сбивает с толку, но я считаю, что это ошибка, потому что он думает, что пользователь отменил процесс входа в систему. Дело в том, что я никогда не вижу всплывающее окно с вопросом, хочу ли я войти в систему или принять разрешения .... Итак, я добавил приложение Facebook на телефон, и оно сработало ... ну, это здорово, но что, если у меня есть пользователь без приложения, но у него есть 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];
}

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

Спасибо

A


person Andy    schedule 30.01.2014    source источник
comment
Вы указали разрешение basic_info в своем массиве разрешений?   -  person MAB    schedule 31.01.2014
comment
Вы держите пари! Он работает (аутентифицирует), если присутствует приложение FB, поэтому я считаю, что разрешения верны   -  person Andy    schedule 31.01.2014
comment
Можете ли вы проверить настройки в Facebook, если разрешение вашего приложения отключено   -  person MAB    schedule 31.01.2014
comment
Что ты имеешь в виду под офф? Когда я захожу в настройки на FB, я вижу там приложение... Что я ищу?   -  person Andy    schedule 31.01.2014
comment
там должен быть uiswitch справа он выключен?   -  person MAB    schedule 31.01.2014
comment
Извините, я неправильно понял - ну, когда я впервые тестировал, да, он был там и был включен - теперь я вышел из настроек, чтобы проверить, будет ли он работать, поэтому в данный момент я не вошел в настройки.   -  person Andy    schedule 31.01.2014
comment
K Я только что вошел в систему - приложение не отображается .... Возможно, придется переустановить из Xcode, я полагаю   -  person Andy    schedule 31.01.2014
comment
@asavu У меня такая же проблема. Принятый в настоящее время ответ просит всех пользователей сбросить местоположение и конфиденциальность, прежде чем они смогут использовать приложение, что явно не является решением. Вам когда-нибудь удавалось это исправить?   -  person hunteros    schedule 18.06.2014
comment
@hunteros Я проверю свою кодовую базу, но я думаю, что полностью переработал этот код, более внимательно следя за SDK, это связано с изменениями состояния сеанса, а не с входом и выходом из системы. Дайте мне знать, если вам все еще нужна помощь с этим.   -  person Andy    schedule 30.06.2014
comment
@asavu с момента обновления моего Facebook SDK до версии 3.15 я не видел этой проблемы, поэтому надеюсь, что она решена. Спасибо за вашу помощь!   -  person hunteros    schedule 30.06.2014


Ответы (3)


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

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

person MAB    schedule 31.01.2014
comment
Не сработало. Должен ли я также удалить приложение из настроек FB, а затем перезагрузить устройство (симулятор)? Что, если это произойдет в реальном контексте - person Andy; 31.01.2014
comment
когда вы отдыхаете от местоположения и конфиденциальности, ваше приложение не должно быть в настройках FB - person MAB; 31.01.2014
comment
Хорошо, теперь я удалил приложение из своего FB и сбросил настройки, как вы сказали. Теперь он регистрирует меня и мгновенно выходит из системы, ссылаясь на те же ошибки после успешного входа в систему, НО теперь он также говорит об ошибке 400, пользователь не аутентифицировал приложение (что имеет смысл, потому что мне никогда не давали возможность) Он также говорит, что сеанс больше не действительны.... - person Andy; 31.01.2014
comment
когда вы пытаетесь войти в систему, приложение выдает запрос на доступ к учетной записи FB? - person MAB; 31.01.2014
comment
Нет, это не так - он просто сразу выходит из строя - если я вошел в системную учетную запись. Когда я сделал то, что вы сказали, это вызвало у меня некоторые символические ошибки, а затем другие ошибки... - person Andy; 31.01.2014
comment
@MAB Я развертываю приложение для тестирования, которое также сталкивается с этой проблемой. Однако те, кто не может войти в систему, подтвердили, что они никогда не нажимали «Не разрешать», и в их настройках отображается, что они разрешают мое приложение. Нашли ли вы какие-либо решения, которые не полагаются на сброс пользователями своего местоположения и конфиденциальности? - person hunteros; 18.06.2014

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

Нажмите + Добавить платформу.

Введите свой идентификатор пакета.

Включите единый вход.

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

person Shantanu    schedule 24.06.2014

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

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

person Mihai Popa    schedule 06.05.2014
comment
серьезно, как это хотя бы отдаленно приемлемо с их стороны? - person Matt Baker; 28.05.2014