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")
}
})
}
}
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
}