Swift: я должен позвонить Facebook loginbutton дважды, чтобы получить FBSDKAccessToken

Моя проблема: я должен нажать кнопку входа Facebook дважды, чтобы получить FBSDKAccessToken. После этого маркер сохраняется на протяжении всего использования приложения. При первом нажатии кнопки AccessToken, кажется, есть и «исчезает» снова после того, как наблюдатель получает вызов четыре раза.

То же самое происходит, когда я перемещаю наблюдателя в viewDidAppear() и если я раскомментирую ‘FBSDKProfile.строка enableUpdatesOnAccessTokenChange (true)’.

У меня есть следующий код:
В моем AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Let Facebook API know we finished launching         
    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    return true
}

func applicationDidBecomeActive(application: UIApplication) {
    // Register actions, such as add clicks and app FB statistics
    FBSDKAppEvents.activateApp()
}

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

В моем LoginOrSignupViewController

class LoginOrSignupViewController: UIViewController, FBSDKLoginButtonDelegate {

@IBOutlet weak var buttonFacebooklogin: FBSDKLoginButton!

override func viewDidLoad() {
    super.viewDidLoad()

    // Customize the facebookLogin button   
    buttonFacebooklogin.readPermissions = ["public_profile", "email", "user_friends"]
    buttonFacebooklogin.delegate = self
    //FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(listenForFBLogin), name: FBSDKAccessTokenDidChangeNotification, object: nil)
}

In my viewDidAppear () I have some print statements. А также в моем Facebook кнопку входа. Я замечаю, что функция наблюдателя вызывается 4 раза, первые два раза есть AccessToken, последние два раза нет.

Когда я снова нажимаю кнопку входа в Facebook, она действует так, как должна.
оператор Print:

Первый раз я нажимаю кнопку входа:

Observer listenForFBLogin function...
We got a token here...
<FBSDKAccessToken: 0x7fa0896b5f40>
Observer listenForFBLogin function...
We got a token here...
<FBSDKAccessToken: 0x7fa0896b5f40>
Observer listenForFBLogin function...
Even in the listenForFBLogin the Accestoken is empty...
Observer listenForFBLogin function...
Even in the listenForFBLogin the Accestoken is empty...
User is not logged in...

Второй раз я нажимаю кнопку входа:

Observer listenForFBLogin function...
We got a token here...
<FBSDKAccessToken: 0x7fa08b8407b0>
Observer listenForFBLogin function...
We got a token here...
<FBSDKAccessToken: 0x7fa08b8407b0>
Tickee isUserLoggedIn: Logged in with Facebook and Firebase...
User is logged in, go to the tabbar...

Мой код входа Facebook

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {

    if error != nil {
        // Error login
        NSLog("Error van loginButton func:")
        NSLog(error.localizedDescription)
    } else if result.isCancelled {
        // User cancelled login
        // NSLog("User cancelled Facebook login")
    } else {

        // User logged in. Proceed to request Auth from Firebase

        // Signup or Login with Firebase
        let firebaseRef = Firebase(url: "https://tickee.firebaseio.com/")
        let accessToken = FBSDKAccessToken.currentAccessToken().tokenString

        // Auth the User in Firebase
        firebaseRef.authWithOAuthProvider("facebook", token: accessToken, withCompletionBlock: {
            (error, authData) in

            if (error != nil) {
                NSLog("Login failed")
            } else {

                // Check if UID is saved to UserDefaults
                let userUID = self.tickee.getUserUIDFromUserDefaults()

                // Check if UID exists
                if userUID == nil {

                    // UID doesn't not exists, there is no user
                    print("User doesn't exist yet, create new Facebook user in Firebase...")

                    // Create User in Firebase
                    self.tickee.createUserInFirebase("facebook", nameField: nil)

                    // Save UID in NSUserDefaults
                    self.tickee.saveUserUIDtoNSUserDefaults()
                } else {
                    print("User exists already, no need to create one again...")
                }

                print("Done loggin in, now wait for the observer...")

            }
        })
    }
}

1 ответ

  1. В viewDidLoad () я спросил представление, вошел ли пользователь. При входе в систему с Facebook и Authing с Firebase есть несколько асинхронных функций. Результат еще не обработан должным образом, поэтому viewDidLoad вызывается в ближайшее время.

    Я удалил обработку результата после завершения загрузки в самой функции входа и больше не в viewDidLoad()