2015-10-05 3 views
27

Facebook SDKを使用してiosアプリケーションを開発してログインしています。 ストーリーボードの最初のView ControllerとしてLogInViewControllerを設定しました。そこからFBアカウントを使用してログインします。FBSDKAccessToken currentAccessTokenアプリケーション終了後にnil

私は、ユーザーがあるので、私はcurrentAccessTokenをチェックしていますし、それがnilでない場合は、私が直接、第二のViewControllerをロードしていますAppDelegateファイルでは。

にユーザーがログイン後に正しくセットされている別の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のための警告を得ているので、segue put tストーリーボードからの授与:

警告:ビューが ウィンドウ階層内にないMapViewControllerを表示しようとしました!

+0

FBAccessToken.currentAccessTokenには時間がかかります。 sessionStateChangedNotificationを使用してそれが利用可能になるのを待つ必要があります(既に行っているように)。 – ZeMoon

+0

ありがとうございます。どのくらいの時間が必要ですか?これは、ユーザーがかなり速くアプリケーションを終了すると、彼は再ログインする必要があることを意味しますか?以前のFBSDKのバージョンでは、キャッシュされたアクセストークンのチェックが行われていましたが、これはどのように行うべきかわかりません。 –

+0

私はLoginViewControllerのviewDidAppearにsessionsStateChangedNotificationを入れようとしましたが、何も変わりませんでした。 –

答えて

51

あなたがFBSDKAccessToken.currentAccessToken()を求めているため、問題はあなたがいつでも上記の行を呼び出した後にアクセストークンを確認することができ

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

と呼ば持つ前にあります。

EDIT:説明

上記ラインはFacebookのSDKプロセスlaunchOptionsができ、それを認識し、アプリケーションのユーザーを保持するために必要になり、必要な情報を抽出します。

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

+0

@ZeMoonあなたの答えを詳しく教えてください。 – Kaunteya

+0

@Kaunteya Facebook SDKは、操作を行う前に初期化する必要があります。具体的にどのように具体化することができますか? – ZeMoon

+2

素晴らしい!ありがとうございます。これは文書のどこで見つかりましたか? –

13

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

キーチェーン共有が有効になっていないためです(Xcode 8、iOS 10)。修正するには、App - > Capabilities - > Keychain Sharingに行き、電源を入れます。

これが完了したら、引き続き承認プロセスを経てアプリに戻ります。後はすべてうまくいくはずです。

+0

これも試して、まだ私のために働いていない。シミュレーターはセッションを失います。ログに記録されたこの文字列に関連している可能性があります: 'シミュレータのバグのためにNSUserDefaultsにアクセストークンを格納することに戻りました' – victor

+0

@victor - 実デバイスでのテストを続けていますか? – syllabix

+0

実際のデバイスでまだ試してみませんでしたか?誰かがシミュレータではなくデバイスで作業していたのであれば、それはシミュレータ上で動作しているはずです – victor

-1

すでに解決策を試しても問題が残っている場合は、これを試してください。

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

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

これはなぜ起こったのかわかりませんが、これが私たちの問題を解決しました。ネットワークの遅延やバグがある可能性があります。まだ後であってもappdelegateにFBSDKApplicationDelegate.sharedInstance()を設定し、問題を持つ人のために

0

、uはこの1

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

のようなあなたのXcodeのコンソールにエラーが出る場合には、シミュレータのバグであると私は実際のデバイスを使用してみてください判明それは動作しますが、アクセストークンは再びnilではありません。 これは@Kalでの応答についての@victorのコメントです。

関連する問題