2016-07-23 105 views
1

我使用下面的代码的Facebook登录。它对于绝大多数用户来说工作得非常好,但由于某些原因,它对于少数几个人来说是崩溃的。斯威夫特的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){ 
 
      FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email, gender, age_range, locale"]).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

你不应该假设result字典包含了所有你正在访问的密钥。举例来说,如果result字典中不包含用户的电子邮件这行代码会失败:

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

所以,尽量用as?,而不是使用as!操作:

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