首页 文章

Swift Facebook登录崩溃

提问于
浏览
1

我使用下面的代码进行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")
            }
        })

    }
}

1 回答

  • 1

    您不应该假设 result dict包含您正在访问的所有密钥 . 例如,如果 result dict不包含用户的电子邮件,则此行代码将失败:

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

    因此,尝试使用 as? 而不是使用 as! 运算符:

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

相关问题