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

IOS Parse Facebook Ошибка входа в систему 308 FBSDKLoginBadChallengeString

Я пытаюсь внедрить вход в Facebook в своем приложении iOS, используя Parse.

let permissionsArray = ["public_profile", "email"]

PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
    { (user: PFUser?, error: NSError?) in

    if let user = user {
        //we logged in!
    }
    else {
        //login error!
    }
}

Это хорошо работает в симуляторе, но не на устройстве. На устройстве я получаю эту ошибку:

Ошибка домена = com.facebook.sdk.login Код = 308 "Операция не может быть завершена (ошибка com.facebook.sdk.login 308.)

Код ошибки 308 для FBSDKLoginBadChallengeString, "В ответе на вход отсутствовала допустимая строка запроса."

После того, как я авторизую свое приложение в Facebook, это называется:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}

URL-адрес:

fb1640722449492705://authorize/#state=%7B%22challenge%22%3A%225OKWv3wN%2BEH%2BeQu48Xv6ty%2BRuek%3D%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A1%2C%220_auth_logger_id%22%3A%22564CD915-2CFC-4989-9AF6-CEA389908D51%22%7D&granted_scopes=user_birthday%2Cpublic_profile&denied_scopes=&signed_request=c8SBBDeaNpF-R_XTYx4LRA0BWm5p9IwXDr8M4nL3YXI.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUURhTXJibGw4Q3dITkd5M0xnQmNkVTNuYWRkeEVoTU5mMmx3eFpZU2IwZl9SU284YXhZdXZaRS02RnA2bU5Cdy1CWkVoRmt2Zk1xX1AxSHltUG00aWhkWE9hYmlvWFBiMnpCYkVnR1RRX3lzZVFIZXdHU19OcmpkNUF6WGtob1dfVE4wTmRrSGk5MzY0V2hFWUJDV0dfcE16RXpQVExHWE13X1dzb0QzZGtITm5fM0tHNjFxUjJyM3RDWVlNQTE4WENpS1dXTHUyM2dIRVhmTXc3ZTQ0M2xDQUtGRl9KSXcyVk1sS01FOTQ4dHQ2U1Fqb0tlVkp4RmJNSEFsWDZFYWxlUnQ2aGRrTGZlU2xuVTV5VjZ1bFhldHkxeEV5RmRDZVFHb2RXQ0dULVVCd3QyM0haY0dxNk8zbnE1cDRNWjNFZ012U2JhSGZyMmF6Wm8xUXk2X2xSQVNWcFlMVDZUdU5wZnMwVkJqNEdSaFEiLCJpc3N1ZWRfYXQiOjE0MzM0MTg2MDksInVzZXJfaWQiOiIxNDM3MzM0ODk5OTIwNDA5In0&access_token=CAAXUOnbG6uEBANtAd9DzWBSu4LLOEcPsu86Ny0Ir

Да, я следил за всем в Руководстве пользователя для входа в Parse Facebook (убедитесь, что все идентификаторы пакетов совпадают, реализованы все необходимые методы AppDelegate и т.д.).

Что именно означает эта ошибка и как вы ее решаете?

4b9b3361

Ответ 1

Исправлено. Эта проблема была вызвана входом в систему с Parse и с помощью FBSDKLoginButton.

Вот что я делал:

//in my UI setup code:
let fbLoginButton = FBSDKLoginButton()
fbLoginButton.addTarget(self, action: "fbButtonTouched:", forControlEvents: UIControlEvents.TouchUpInside)

....

func fbButtonTouched() {
    let permissionsArray = ["public_profile", "email"]

    PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
        { (user: PFUser?, error: NSError?) in

            if let user = user {
                //we logged in!
            }
            else {
                //login error!
            }
    }
}

Я узнал (трудный путь), что нажатие FBSDKLoginButton пытается зарегистрировать пользователя! Не нужно было также регистрировать пользователя при использовании PFFacebookUtils.logInInBackgroundWithReadPermissions. Поэтому я просто избавился от fbButtonTouched(), и я мог бы с удовольствием войти.

Итак, произошло то, что я пытался одновременно подключить два входа, которым симулятор был доволен, но не устройством.

Если вы хотите знать, почему, потому что запрос проверки подлинности входа, который он получил не соответствовал ожидаемому, потому что он получил тот, который был получен из первого журнала в попытке после того, как он отправил одну из второй попытки входа в систему, и поэтому ожидал второй запрос на аутентификацию попыток попыток.

Документация для FBSDKLoginButton в настоящее время ничего не говорит о том, что нажатие на нее инициирует поток журнала и потому что это подкласс UIButton, вы могли бы подумать, что вы должны addTarget к нему и реализовать поток входа самостоятельно. И наличие двух логинов одновременно приводит к вводящему в заблуждение FBSDKLoginBadChallengeString. Рецепт катастрофы...

EDIT: Соответствующая документация обновлена:

FBSDKLoginButton работает с [FBSDKAccessToken currentAccessToken], чтобы определить, что отображать, и автоматически запускает аутентификацию при использовании (т.е. вам не нужно вручную подписывать целевые объекты).

(мой акцент)

Ответ 2

Простое решение для меня. Просто включите совместное использование ключей в возможностях

Включить совместное использование ключей

Ответ 3

Я следил за обходным путем от totvos и его работой для меня, а также при использовании FBSDKLoginKit 4.7.1 и FBSDKCoreKit 4.8:

Обходной путь... создайте приложение и скопируйте его на телефон, а затем запустите приложение с устройства (а не отладчик). Затем присоедините отладчик к текущему процессу. Кажется, что это связано с тем, нарушает это, и различные операции с брелками, по-видимому, работают правильно во время отладки.

Ссылка: https://forums.developer.apple.com/thread/4743#85335


Update:

Это обходное решение не работало все время, поэтому я закончил использование ответа @coco выше: fooobar.com/questions/99627/...

Ответ 4

По-видимому, единственным решением, которое сработало для меня, является добавление права доступа для связывания ключей для цели.

Вы можете найти его в Project_name- > target_name- > Capabilities- > Keychain Sharing

Ответ 5

Я нашел эту проблему при обновлении до:

FBSDKCoreKit 4.4.0
FBSDKLoginKit 4.4.0
FBSDKShareKit 4.4.0.

Он ушел, когда я понизился до:

FBSDKCoreKit 4.2.0
FBSDKLoginKit 4.1.0
FBSDKShareKit 4.1.0

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

Ответ 6

Я только видел эту ошибку, когда я вышел из системы, а затем снова зашел в систему.

Мой логин и код выхода были расположены в разных файлах, так как соответствующий пользовательский интерфейс для входа и выхода полностью отличается, и я создал экземпляры двух экземпляров FBSDKLoginManager. Консолидация только одного экземпляра решила проблему для меня.

Ответ 7

Попробуйте запустить приложение прямо с вашего устройства без необходимости запускать его с вашего Xcode. Затем войдите в Facebook, чтобы не беспокоиться о 308. После этого вы можете возобновить запуск с Xcode на свое устройство без той же проблемы.

Это кажется проблемой между FB SDK и iOS и не связано с Parse. Я был бы признателен, если бы кто-то мог просветить нас по этому вопросу.

Моя версия Xcode 7.1, FB SDK - 4.8.x.

Ответ 8

Я использую

pod 'FBSDKCoreKit', '~> 4.8.0'
pod 'FBSDKLoginKit', '~> 4.8.0'
pod 'FBSDKShareKit', '~> 4.8.0'

... и имел проблему code 308, когда я вышел из системы и вошел в систему в течение того же сеанса. Использование [[FBSDKLoginManager alloc] logOut] или [facebookLoginManager logOut] (с постоянным менеджером) непосредственно перед вызовом logInWithReadPermissions: не помогло, но добавив

[FBSDKAccessToken setCurrentAccessToken:nil];
[FBSDKProfile setCurrentProfile:nil];

перед вызовом logInWithReadPermissions: работает нормально. (Протестировано в iOS 9.2.)

Ответ 9

У меня также была ошибка 308, однако я не использовал Parse SDK.

Эти ошибки начали появляться, когда я обновил iOS SDK от версии 4.0.1 (FacebookSDKs-iOS-20150402) до одной из более новых версий (4.2.0 - FacebookSDKs-iOS-20150528 или 4.3.0 - FacebookSDKs-iOS-20150625).

Понижение Facebook iOS SDK для версии 4.0.1 решило эту проблему для меня.

В качестве примечания: новые версии SDK, похоже, хорошо коррелируют с появлением 308 сообщений об ошибках на SO в начале июня.

Ответ 10

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

Ответ 11

если выйти из системы и снова войти в систему, не выходя из этого приложения, эта ошибка также приходят,

let deletepermission = FBSDKGraphRequest(graphPath: "me/permissions/", parameters: nil, HTTPMethod: "DELETE")
            deletepermission.startWithCompletionHandler({(connection,result,error)-> Void in
                println("the delete permission is \(result)")
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    FBSDKAccessToken.setCurrentAccessToken(nil)
                    FBSDKProfile.setCurrentProfile(nil)
                    fbLoginManager.logOut()
                    AppDelegate.sharedAppDelegte().logout()
                })
            })

Ответ 12

Im, используя PFFacebookUtils 1.9.0 и FBSDKLoginKit 4.7.0 случилось со мной после выхода из системы и входа (без перезапуска приложения) решение - цель c: просто добавьте [[PFFacebookUtils facebookLoginManager] logOut]; до [PFFacebookUtils logInInBackgroundWithReadPermissions

Ответ 13

Для устранения этой ошибки выполните следующие действия:

  • Перейдите в свой проект
  • Возможности Click
  • Включить доступ к брелокам

Ответ 14

Официальный ответ от Facebook:

Мы уже отслеживаем эту проблему в другом отчете об ошибке, и кажется чтобы быть ошибкой на стороне Apple.

https://developers.facebook.com/bugs/919990934704584/

Ответ 15

Используйте тот же экземпляр FBSDKLoginManager до выхода из системы, затем создайте новый экземпляр.

[fbLoginManager logOut];
fbLoginManager = [[FBSDKLoginManager alloc] init];

Ответ 16

Вам не нужно понижать для этого.

Выполните следующие действия, и он должен работать: - Очистите полученные производные данные (Xcode → Настройки → Местоположение → Нажмите маленькую стрелку рядом с данными Derived). Перед выполнением этого теста убедитесь, что вы прочитали о полученных данных. Если у вас сложный проект и вы сделали глупые ошибки (например: удалили какой-то файл), вам, возможно, придется выяснить проблему до перезапуска вашего приложения. Но это будет не так сложно. - Удалить свое приложение из своего устройства/симулятора - Удалите одобрение Facebook на Facebook (Настройка → Приложение → Нажмите "x", чтобы удалить приложение)

Перезапустите приложение, и все должно работать.

Удачи!

Ответ 17

Код ошибки 308 - FBSDKLoginBadChallengeString

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

Я предполагаю, что это связано с входом в iOS9 Safari, а не на 100% уверенным, хотя

Ответ 18

Я исправлю это с помощью: 1.Add Bolts.framework 2.in AppDelegate: #import

Ответ 19

Обновите версию SDK для Facebook до последней версии.

Ответ 20

Это из-за ошибки authenticationChallenge, когда вы ошибочно пытаетесь войти в систему дважды одновременно, а затем дополнительные логины дадут вам предупреждение о связке ключей на консоли во время отладки, эта ошибка будет заметна, когда вы будете отлаживать устройство. Без режима отладки вы не получите эту ошибку, причина в том, что keychain будет работать нормально, если вы не отлаживаете.

Для этого существует несколько обходных решений: 1. Попробуйте войти в систему без режима отладки, и после ее успешного завершения вы также сможете успешно войти в систему в режиме отладки. 2. Проверьте код ошибки FBSDKLoginBadChallengeString и вызовите [FBSDKAccessToken setCurrentAccessToken:nil], чтобы очистить токен и выполнить вход снова.

Ответ 21

У меня возникла такая же проблема, когда я пытался поймать логин и выход из системы, как показано ниже

loginButton = [[FBSDKLoginButton alloc] init];
// Handle clicks on the button
[loginButton
 addTarget:self
 action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];

// Once the button is clicked, show the login dialog
-(void)loginButtonClicked
{
  FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
  [login
    logInWithReadPermissions: @[@"public_profile"]
          fromViewController:self
                     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) { 
      NSLog(@"Process error");
    } else if (result.isCancelled) {
      NSLog(@"Cancelled");
    } else {
      NSLog(@"Logged in");
    }
  }];
}

Но это полезно только для пользовательской кнопки входа в систему, если вы используете кнопку входа по умолчанию fb по умолчанию, FBSDKLoginManager уже инициализирован, вы получите ошибку при попытке создать другую.

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

    loginButton = [[FBSDKLoginButton alloc] init];
    loginButton.delegate = self;


- (void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error {
    if (!error) {
        [self getFBProfile];
    }
}

- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton {
    [self logout];
}