web-dev-qa-db-ja.com

アプリを終了した後のFBSDKAccessToken currentAccessToken nil

Facebook SDKを使用してログインするiOSアプリを開発しています。 LogInViewControllerをStoryboardの初期View Controllerとして設定しました。そこから、ユーザーはFBアカウントを使用してログインします。

ユーザーがログインすると正しくロードされる別のViewControllerがあります。

AppDelegateファイルでは、currentAccessTokenを確認していますが、nilでない場合は、ユーザーが既にログインしているため、2番目のViewControllerを直接読み込んでいます。

ただし、アプリを終了して再起動した場合、currentAccessTokenは常にnilです。ホームボタンを押して、バックグラウンドで実行中にアプリを再度開いた場合にのみ機能します。

コードの詳細は次のとおりです。

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を表示しようとしました!

28
Andreas Xenos

問題は、呼び出す前にFBSDKAccessToken.currentAccessToken()を呼び出すためです。

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

上記の行を呼び出した後はいつでもアクセストークンを確認できます。

編集:説明

上記の行により、Facebook SDKはlaunchOptionsを処理し、アプリケーションのユーザーを認識して保持するために必要な必要な情報を抽出できます。

ユーザーが既にログインしている場合、これはFacebook SDKを初期化するだけで、永続化されたデータに基づいてユーザーをログインさせます。

57
ZeMoon

私は、この問題に頭を打ちながらニースの半日を過ごしました。すべてのデリゲートメソッドが存在することを確認したにもかかわらず、FBSDKAccessToken.current()は常にnilを返しました。

これは、キーチェーン共有が有効になっていないためであることがわかりました(Xcode 8、iOS 10)。修正するには、アプリ->機能->キーチェーン共有に移動してオンにします。

これが完了したら、認証プロセスを経てアプリに戻る必要があります。すべてが問題ないはずです。

15
Kal

AppdelegateでFBSDKApplicationDelegate.sharedInstance()を設定しても問題が解決しない場合は、Xcodeコンソールでこのようなエラーが発生するかどうかを確認してください

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

それはシミュレータのバグであり、私は実際のデバイスを使用してみますが、それは動作します、アクセストークンは再びゼロではありません。

0
Abadi

すでに解決策を試してみたが、まだ問題がある場合は、これを試してください。

私の共同プログラマーと私は、Facebookで提供されているLoginManager().loginメソッドを使用していますSwift SDK。(Xcode8、Swift 3、iOS 10)

この問題を引き起こした可能性のあるアクションの1つは、ログインに成功し、すぐにアプリを終了してから、アプリを再度開いてAccessToken.currentnilを返します。ログイン後、20秒以上待って(正確な待ち時間がわからない、7〜20秒待って)アプリを強制終了すると、問題は解決したようです。

なぜこれが起こったのかはわかりませんが、これで問題は解決しました。ネットワークの遅延やバグがあるのではないかと推測しています。

0
MnS