以下代码不适用于:
if let rawProfile = user?.providerData["cachedUserProfile"] as? ......
错误:无法用索引类型“字符串”下标“ [FIRUserInfo]”类型的值
我一直在努力将项目从旧的Firebase控制台/文档更新到新的。
但是,似乎只有在用户注册FIRUserInfo时,某些新内容才允许被拉出,例如displayName,photoURL和email。
知道我将如何运用我以前喜欢的事物(例如性别)吗?
项目清单
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
编辑越来越近,能够拉出我需要的数据,但不能创建用户...
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)
经过几个小时的搜索,阅读和升级到最新的Cocoapods,我解决了这个问题。
它是Info.plist设置,json解析和其他一些东西的组合。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句