我使用下面的代码登录Facebook。它对绝大多数用户来说都很好,但出于某种原因,它对极少数用户来说会崩溃。
因为没有人提交任何坠机报告,而且我自己似乎无法重现这个问题,这意味着我正在绞尽脑汁想弄清楚原因。
非常感谢您的帮助!
@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")
}
})
}
}
您不应该假设result
dict包含您正在访问的所有密钥。例如,如果result
dict不包含用户的电子邮件,则这行代码将失败:
let email : NSString = result.valueForKey("email") as! NSString
因此,尝试使用as?
而不是使用as!
运算符:
if let email = result.valueForKey("email") as? NSString {
// do something
}