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

Почему я получаю ошибку com.facebook.sdk.login 308?

Я использую Xcode 7.0, тестирование на iOS 9.0.2 и использование Facebook SDK 4.7.0.

Когда я регистрирую пользователя, большую часть времени все работает так, как должно, однако иногда я продолжаю получать эту ошибку, и я понятия не имею, почему!

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

После исследования я увидел, что некоторые люди получают ошибку при входе в систему с parse.com FBUtils и официальным FBSDK в то же время, однако я использую только FBSDK в своем проекте.

Итак, мой вопрос: почему я получаю эту ошибку и как мне ее избавиться?

Изменить - добавление кода

Вот моя логика логики:

func loginWithFacebook(sender: UIViewController, completion: (profile: FBSDKProfile?, token: String?, cancelled: Bool, error: String?) -> Void ) {

    FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
    NSNotificationCenter.defaultCenter().addObserver( sender , selector: "onProfileUpdated:", name:FBSDKProfileDidChangeNotification, object: nil)
    let loginManager = FBSDKLoginManager()
    loginManager.logInWithReadPermissions(["email", "public_profile"], fromViewController: sender) { (result: FBSDKLoginManagerLoginResult!, error: NSError!) -> Void in
        if error != nil {
            print("ERROR")
            completion(profile: nil, token: nil, cancelled: false, error: error.localizedDescription)
            print(error.localizedDescription)

        } else if result.isCancelled {
            print("CANCELLED")
            completion(profile: nil, token: nil, cancelled: true, error: nil)

        } else {
            print("NO ERROR")
            if FBSDKProfile.currentProfile() == nil {
                print("PROFILE IS NIL")
                completion(profile: nil, token: result.token.tokenString, cancelled: false, error: nil)
            } else {
                print("PROFILE IS NOT NIL")
                completion(profile: FBSDKProfile.currentProfile(), token: result.token.tokenString, cancelled: false, error: nil)
            }

        }

    }
}
4b9b3361

Ответ 1

Для Xcode8 - iOS10,

Включить Разделение связок ключей на вкладке "Возможности" исправленной проблемы.

введите описание изображения здесь

Более подробную информацию можно найти здесь: https://github.com/facebook/facebook-sdk-swift/issues/51


Для Xamarin Studio (предложенный @Kenneth),

Добавьте файл Entitlements.plist в Пользовательские права в параметрах iOS Bundle Signing в проекте iOS.

Ответ 2

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

let loginManager = FBSDKLoginManager()

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

lazy var fbLoginManager: FBSDKLoginManager = {
   return FBSDKLoginManager()
}()

UPDATE

Facebook осознает ошибку и изучает ее. Я обнаружил, что мое решение не всегда работает и обновило мой код до следующего и не видел его с тех пор:

private var _fbLoginManager: FBSDKLoginManager?

var fbLoginManager: FBSDKLoginManager {
    get {
        if _fbLoginManager == nil {
            _fbLoginManager = FBSDKLoginManager()
        }
        return _fbLoginManager!
    }
}

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

Ответ 4

У меня также была эта ошибка, причина в моем случае: AuthentificationController, на котором была кнопка входа в Facebook, была представлена ​​без контроллера навигации. Чтобы устранить эту ошибку, я просто добавил контроллер навигации и установил мой AuthentificationController как root.