Swift Facebook 登录崩溃
Swift Facebook Login Crash
我正在使用下面的代码登录 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
字典包含您正在访问的所有键。例如,如果 result
字典不包含用户的电子邮件,这行代码将失败:
let email : NSString = result.valueForKey("email") as! NSString
因此,尝试使用 as?
而不是使用 as!
运算符:
if let email = result.valueForKey("email") as? NSString {
// do something
}
我正在使用下面的代码登录 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
字典包含您正在访问的所有键。例如,如果 result
字典不包含用户的电子邮件,这行代码将失败:
let email : NSString = result.valueForKey("email") as! NSString
因此,尝试使用 as?
而不是使用 as!
运算符:
if let email = result.valueForKey("email") as? NSString {
// do something
}