0

Der folgende Code funktioniert nicht Preis:Firebase Facebook Log in FIRUserInfo

if let rawProfile = user?.providerData["cachedUserProfile"] as? ...... 

Error: Cannot subscript a value of type '[FIRUserInfo]' with an index of type 'String'

Ich habe an der Aktualisierung mein Projekt von der alten Konsole Firebase/Dokumentation zum neuen Arbeits.

Es scheint jedoch, dass die neue nur bestimmte Dinge erlaubt, wenn ein Benutzer sich anmeldet, FIRUserInfo, wie zum Beispiel displayName, photoURL und E-Mail.

Irgendeine Idee, wie ich in der Lage sein würde, die Dinge zu ziehen, die ich wie Geschlecht verwendete?

Liste item

static func createUser(viewController: UIViewController, completion: (success: Bool) -> Void) { 
    let ref = FIRDatabase.database().reference() 
    let facebookLogin = FBSDKLoginManager() 

    facebookLogin.logInWithReadPermissions(["public_profile", "email", "user_friends"], fromViewController: viewController, handler: {(facebookResult, facebookError) -> Void in 
     if facebookError != nil { 
      print("Facebook login failed. Error \(facebookError)") 
      completion(success: false) 
     } else if facebookResult.isCancelled { 
      print("Facebook login was cancelled.") 
      completion(success: false) 
     } else { 
      let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString) 

      FIRAuth.auth()?.signInWithCredential(credential, completion: { (user, error) in 
       if error != nil { 
        print("Login failed. \(error)") 
        completion(success: false) 
       } else { 
        if let rawProfile = user?.providerData["cachedUserProfile"] as? [String: AnyObject] { 
         guard let firstName = rawProfile["first_name"] as? String else { return } 
         guard let gender = rawProfile["gender"] as? String else { return } 
         guard let uid = rawProfile["id"] as? String else { return } 
         guard let picture = rawProfile["picture"] as? [String : AnyObject] else { return } 
         guard let data = picture["data"] as? [String : AnyObject] else { return } 
         guard let url = data["url"] as? String else { print("failed in data") ; return } 

         let email = user?.providerData["email"] as! NSString as String 

         let newUser = User(firstName: firstName, gender: gender, email: email, imageURL: url) 

         FirebaseController.base.child("users").child(uid).updateChildValues(newUser.jsonValue) 

         self.currentUserID = uid 

EDIT immer näher und die Daten ziehen zu können, brauche ich aber nicht den Benutzer zu schaffen ...

static func createUser(viewController: UIViewController, completion: (success: Bool) -> Void) { 
    let facebookLogin = FBSDKLoginManager() 

    facebookLogin.logInWithReadPermissions(["public_profile", "email", "user_friends"], fromViewController: viewController, handler: {(facebookResult, facebookError) -> Void in 
     if facebookError != nil { 
      print("Facebook login failed. Error \(facebookError)") 
      completion(success: false) 
     } else if facebookResult.isCancelled { 
      print("Facebook login was cancelled.") 
      completion(success: false) 
     } else { 
      let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString) 

      FIRAuth.auth()?.signInWithCredential(credential, completion: { (user, error) in 
       if error != nil { 
        print("Login failed. \(error)") 
        completion(success: false) 
       } else { 
        let userDetails = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, first_name, email, gender, picture"]) 

        userDetails.startWithCompletionHandler({ (connection, result, error) in 
         if error != nil { 
          print("Error connecting FBSDKGraphRequest") 
         } else if let result = result { 
          guard let firstName = result["first_name"] as? String else {return} 
          guard let gender = result["gender"] as? String else {return} 
          guard let uid = result["id"] as? String else {return} 
          guard let imageURL = result["url"] as? String else {return} 
          guard let email = result["email"] as? String else {return} 

          let newUser = User(firstName: firstName, gender: gender, email: email, imageURL: imageURL) 

          FirebaseController.base.child("users").child(uid).updateChildValues(newUser.jsonValue) 

Antwort

0

Nach ein paar Stunden des Suchens, Lesen und Aufrüsten auf die neuesten Cocoapods, löste ich das Problem.

Es war eine Mischung aus Info.plist Einstellungen, JSON Parsing und ein paar andere Dinge.