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

FBSDKAccessToken currentAccessToken nil после выхода из приложения

Я разрабатываю приложение ios с помощью SDK для входа в систему. Я установил LogInViewController в качестве начального контроллера представления в раскадровке, откуда пользователь входил в систему с использованием учетной записи FB.

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

В файле AppDelegate я проверяю currentAccessToken, и если он не равен нулю, я загружаю непосредственно второй ViewController, потому что пользователь уже выполнил вход в систему.

Тем не менее, currentAccessToken всегда равен нулю, если я покинул приложение и перезапустил его. Он работает только в том случае, если я нажимаю кнопку "домой" и снова открываю приложение, пока он все еще работает в фоновом режиме.

Вот подробности в коде:

AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    self.customNavigationBar()
    if (!isIcloudAvailable()) {
        self.displayAlertWithTitle("iCloud", message: "iCloud is not available." +
           " Please sign into your iCloud account and restart this app")
        return true
    }

    if (FBSDKAccessToken.currentAccessToken() != nil) {
        self.instantiateViewController("MapViewController", storyboardIdentifier: "Main")
    }

    return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
}

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

func applicationWillResignActive(application: UIApplication) {
        FBSDKAppEvents.activateApp()
}

func applicationDidBecomeActive(application: UIApplication) {
        FBSDKAppEvents.activateApp()
}

LogInViewController.swift

override func viewDidLoad() {
    super.viewDidLoad()    
    // Listen to the Facebook notification and when received, execute func handleFBSessionStateChangeWithNotification
NSNotificationCenter.defaultCenter().addObserver(self, selector:"handleFBSessionStateChangeWithNotification:", name: "SessionStateChangeNotification", object: nil)
}

func handleFBSessionStateChangeWithNotification(notification: NSNotification) {
    // Switch to MapViewController when logged in
    if ((FBSDKAccessToken.currentAccessToken()) != nil) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let mapViewController = storyboard.instantiateViewControllerWithIdentifier("MapViewController") as! MapViewController
        self.presentViewController(mapViewController, animated: false, completion: nil)
    }
}

Я не знаю, связано ли это, но я также получаю предупреждение для MapViewController, потому что на него нет ракурса из раскадровки:

Предупреждение. Попытайтесь представить MapViewController, чей вид отсутствует в иерархии окон!

4b9b3361

Ответ 1

Проблема заключается в том, что вы вызываете FBSDKAccessToken.currentAccessToken() перед тем, как позвонить

FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

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

EDIT: Объяснение

Вышеприведенная строка позволяет SDK для Windows обрабатывать startOptions и извлекать необходимую информацию, которая потребуется для распознавания и сохранения пользователя для приложения.

В тех случаях, когда пользователь уже зарегистрирован, это просто инициализирует SDK Facebook, который, в свою очередь, регистрирует пользователя на основе сохраненных данных.

Ответ 2

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

Оказывается, это связано с тем, что функция Keychain Sharing не включена (Xcode 8, iOS 10). Чтобы исправить это, перейдите в Приложение → Возможности → Обмен ключами и включите.

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

Ответ 3

Для тех, у кого еще проблема, даже после установки FBSDKApplicationDelegate.sharedInstance() на appdelegate, получится, если u получит ошибку на консоли Xcode, подобной этой

Falling back to storing access token in NSUserDefaults because of simulator bug

это ошибка симулятора, и я пытаюсь использовать реальное устройство, и оно работает, токен доступа снова не нуль. так что, может быть, ответ @victor комментарий об этом на @Kal ответ..

Ответ 4

Если вы уже пробовали решения, но все еще имеете проблему, попробуйте это.

Мой со-программист и я используем метод LoginManager().login, указанный в Facebook Swift SDK. (Xcode8, Swift 3, iOS 10)

Одним из возможных действий, вызвавших эту проблему, является успешное вход в систему и немедленное удаление приложения, а затем снова откройте приложение, а AccessToken.current возвращает nil. После входа в систему, если вы ожидаете 20 секунд или больше (мы не уверены в точном времени ожидания, мы ждали 7-20 секунд) и убили приложение, проблема, похоже, была решена.

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