iOS анализирует ошибку входа в Facebook 308 FBSDKLoginBadChallengeString

Я пытаюсь реализовать Facebook login в моем приложении 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.фейсбук.пакет SDK.код входа=308 " операция не может быть завершена. (com.фейсбук.пакет SDK.ошибка входа 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

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

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

21 ответов


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

Enable Keychain Sharing


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

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


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

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

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


обновление:

этот обходной путь не работал все время, поэтому я в конечном итоге использовал ответ @coco выше:https://stackoverflow.com/a/31480026/877225


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

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


Я нашел эту проблему, когда я повышен до:

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 для всех трех?


исправил. Эта проблема была вызвана входом в систему с помощью 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!
            }
    }
}

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

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

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

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

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

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

(Курсив мой)


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

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

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


Я использую

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


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

эти ошибки начали появляться, когда я обновил Facebook 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 в начале июня.


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


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

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()
                })
            })

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


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

  1. перейти к проекту
  2. Выберите Функции
  3. Включить Keychain Access

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

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

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


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

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

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

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

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

Удачи!


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

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

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


я исправляю это с помощью: 1.Добавить Болты.рамки 2.в AppDelegate: #import


обновление Facebook SDK до последней версии решило это.


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

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


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

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 уже инициализирован, вы получите ошибку при попытке создать другой.

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

    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];
}