使用身份验证添加用户+创建用户

时间:2019-11-25 13:49:38

标签: swift firebase google-cloud-firestore firebase-authentication swiftui

当前,我已经成功实现了允许用户使用电子邮件地址和密码创建帐户并将该信息插入Firebase身份验证的功能。我现在要弄清楚的是如何同时获取在注册表单中输入的信息并将新记录插入FireStore。我想插入用户的电子邮件地址,名字和姓氏作为记录。

我尝试添加代码以将记录插入“ SignUp”函数内部,但这似乎破坏了该函数。下面是有效的代码,后面是我尝试的无效代码。

//Working Code

struct SignUpView: View {
@State var email: String = ""
@State var password: String = ""
@State var error: String = ""


@EnvironmentObject var session: SessionStore
let db = Firestore.firestore()

func signUp() {
    session.signUp(email: email, password: password) { (result, error) in
        if let error = error {
            self.error = error.localizedDescription
        } else {
            self.email = ""
            self.password = ""
        }
    }

}    

//Does Not Work (Error: Type 'SignUpView' does not conform to protocol 'View')

struct SignUpView: View {
@State var email: String = ""
@State var password: String = ""
@State var error: String = ""
@State var fname: String = ""
@State var lname: String = ""

@EnvironmentObject var session: SessionStore
let db = Firestore.firestore()

func signUp() {
    session.signUp(email: email, password: password) { (result, error) in
        if let error = error {
            self.error = error.localizedDescription
        } else {
            self.email = ""
            self.password = ""
        }
    }
    // Insert record into Users collection
    db.collection("users").addDocument(data: [
            "fname": fname,
            "lname":lname,
            "email": email ])
    }
    // End Insert
} 

2 个答案:

答案 0 :(得分:2)

Session.SignUp是异步的。

struct SignUpView: View {
@State var email: String = ""
@State var password: String = ""
@State var error: String = ""
@State var fname: String = ""
@State var lname: String = ""

@EnvironmentObject var session: SessionStore
let db = Firestore.firestore()

func signUp() {
    session.signUp(email: email, password: password) { (result, error) in
        if let error = error {
            self.error = error.localizedDescription
        } else {
            self.email = ""
            self.password = ""
// Insert record into Users collection
    db.collection("users").addDocument(data: [
            "fname": self.fname,
            "lname":self.lname,
            "email": self.email ])
    }
    // End Insert

        }
    }

} 

但是您发布的代码不能是SignUpView的完整代码,因为它必须包含

var body: some View {}

答案 1 :(得分:1)

在SwiftUI中向Firestore添加用户模型非常简单。我使用了completionBlock来处理完成,您可以显示一个加载指示器,直到该函数返回一个值。这可能对所有查询都有用。

以下代码会将用户添加到Firestore:

func addUserToDatabase(name: String, email: String, phone: String, completionBlock: @escaping (_ success: Bool) -> Void) {
    let accountData = [
        "name" : name,
        "email" : email,
        "phone" : phone
    ]

    db.collection("users").document(self.user.id).setData(accountData) { err in
        if err != nil {
            completionBlock(false)
        } else {
            completionBlock(true)
        }
    }
}

请注意: 'self.user.id'是身份验证中的用户ID。因此,当您在firebaseAuth中创建用户时,将创建一个唯一的ID,您可以将该ID存储在您的应用中,以便在数据库中创建引用。有助于轻松删除或更改用户数据。

在您的应用中使用此方法的示例

self.addUserToDatabase(name: name, email: email, phone: phone) { (succes) in
    if (succes) {
        print("User added to the database")
        UserDefaults.standard.set(self.user.id, forKey: "uid_current_user")
        completionBlock(true)
    } else {
        print("Something went wrong when trying to add user to the database")
        completionBlock(false)
     }
}