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を表示しようとしました!
問題は、呼び出す前にFBSDKAccessToken.currentAccessToken()
を呼び出すためです。
FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
上記の行を呼び出した後はいつでもアクセストークンを確認できます。
編集:説明
上記の行により、Facebook SDKはlaunchOptionsを処理し、アプリケーションのユーザーを認識して保持するために必要な必要な情報を抽出できます。
ユーザーが既にログインしている場合、これはFacebook SDKを初期化するだけで、永続化されたデータに基づいてユーザーをログインさせます。
私は、この問題に頭を打ちながらニースの半日を過ごしました。すべてのデリゲートメソッドが存在することを確認したにもかかわらず、FBSDKAccessToken.current()
は常にnilを返しました。
これは、キーチェーン共有が有効になっていないためであることがわかりました(Xcode 8、iOS 10)。修正するには、アプリ->機能->キーチェーン共有に移動してオンにします。
これが完了したら、認証プロセスを経てアプリに戻る必要があります。すべてが問題ないはずです。
AppdelegateでFBSDKApplicationDelegate.sharedInstance()
を設定しても問題が解決しない場合は、Xcodeコンソールでこのようなエラーが発生するかどうかを確認してください
Falling back to storing access token in NSUserDefaults because of simulator bug
それはシミュレータのバグであり、私は実際のデバイスを使用してみますが、それは動作します、アクセストークンは再びゼロではありません。
すでに解決策を試してみたが、まだ問題がある場合は、これを試してください。
私の共同プログラマーと私は、Facebookで提供されているLoginManager().login
メソッドを使用していますSwift SDK。(Xcode8、Swift 3、iOS 10)
この問題を引き起こした可能性のあるアクションの1つは、ログインに成功し、すぐにアプリを終了してから、アプリを再度開いてAccessToken.current
はnil
を返します。ログイン後、20秒以上待って(正確な待ち時間がわからない、7〜20秒待って)アプリを強制終了すると、問題は解決したようです。
なぜこれが起こったのかはわかりませんが、これで問題は解決しました。ネットワークの遅延やバグがあるのではないかと推測しています。