2016-07-23 7 views
1

Ich benutze den folgenden Code für einen Facebook Login. Es funktioniert perfekt für die überwiegende Mehrheit der Benutzer, aber aus irgendeinem Grund stürzt es für die wenigen.Swift Facebook Login Crash

Weil niemand irgendwelche Absturzberichte eingereicht hat und die Tatsache, dass ich das Problem nicht reproduzieren kann, bedeutet, dass ich mir den Kopf zerbringe und versuche herauszufinden, warum.

Jede Hilfe sehr geschätzt!


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

Antwort

1

Sie sollten nicht davon ausgehen, dass die result dict alle Schlüssel enthält, die Sie zugreifen. Zum Beispiel wird diese Zeile Code fehlschlagen, wenn die result dict des Benutzers keine E-Mail enthalten:

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

Also, versuchen Sie as? zu verwenden, anstatt die as! Betreiber mit:

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