Search code examples
iosswiftfbsdk

Swift Facebook Login Crash


I am using the code below for a Facebook login. It works perfectly fine for the vast majority of users but for some reason it crashes for the odd few.

Because no one has submitted any crash reports and the fact I can't seem to reproduce the issue myself means I am wracking my head trying to figure out why.

Any help much appreciated!

@IBAction func btnFBLoginPressed(sender: AnyObject) {

    let fbLoginManager: FBSDKLoginManager = FBSDKLoginManager()

    fbLoginManager.logInWithReadPermissions(["public_profile","email", "user_friends"], fromViewController: self, handler: { (result, error) -> Void in

        if error == nil {

            let fbloginresult: FBSDKLoginManagerLoginResult = result

            if result.isCancelled {
                print("cancelled")
                return
            }

            if fbloginresult.grantedPermissions.contains("email") {
                self.getFBUserData()
                //fbLoginManager.logOut()
            }
        }
    })
}

func getFBUserData() {

    if FBSDKAccessToken.currentAccessToken() != nil {

        let params: [String: String] = ["fields": "id, name, first_name, last_name, picture.type(large), email, gender, age_range, locale"]

        FBSDKGraphRequest(graphPath: "me", parameters: params).startWithCompletionHandler({ (connection, result, error) -> Void in
            if error == nil {

                let userName: NSString = result.valueForKey("name") as! NSString
                let facebookID: NSString = result.valueForKey("id") as! NSString
                let firstName: NSString = result.valueForKey("first_name") as! NSString
                let lastName: NSString = result.valueForKey("last_name") as! NSString
                let email: NSString = result.valueForKey("email") as! NSString
                let gender: NSString = result.valueForKey("gender") as! NSString
                let locale: NSString = result.valueForKey("locale") as! NSString

                let defaults = NSUserDefaults.standardUserDefaults()

                defaults.setObject("\(userName)", forKey: "userName")
                defaults.setObject("\(facebookID)", forKey: "facebookID")
                defaults.setObject("\(firstName)", forKey: "firstName")
                defaults.setObject("\(lastName)", forKey: "lastName")
                defaults.setObject("\(email)", forKey: "email")
                defaults.setObject("\(gender)", forKey: "gender")
                defaults.setObject("\(locale)", forKey: "locale")
            }
        })

    }
}

Solution

  • You shouldn't assume that the result dict contains all the keys you are accessing. For instance, this line of code will fail if the result dict does not contain user's email:

    let email : NSString = result.valueForKey("email") as! NSString
    

    So, try to use as? instead of using the as! operator:

    if let email = result.valueForKey("email") as? NSString {
        // do something
    }