28

Facebook SDK を使用してログインする iOS アプリを開発しています。LogInViewControllerユーザーが FB アカウントを使用してログインする場所から、ストーリーボードの初期ビュー コントローラーとしてa を設定しました。

ユーザーがログインすると正しくロードされる別の 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 を提示しようとしています!

4

4 に答える 4

15

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

これは、キーチェーン共有が有効になっていないためであることが判明しました (Xcode 8、iOS 10)。修正するには、App -> Capabilities -> Keychain Sharingに移動し、ON にします。

これが完了したら、承認プロセスを経て、アプリに戻る必要があります。その後、すべてがうまくいくはずです。

于 2016-10-15T15:16:57.430 に答える