Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 使用SwiftUI和Firestore注册电子邮件、名字和姓氏_Firebase_Google Cloud Firestore_Firebase Authentication_Swiftui - Fatal编程技术网

Firebase 使用SwiftUI和Firestore注册电子邮件、名字和姓氏

Firebase 使用SwiftUI和Firestore注册电子邮件、名字和姓氏,firebase,google-cloud-firestore,firebase-authentication,swiftui,Firebase,Google Cloud Firestore,Firebase Authentication,Swiftui,我想对用户进行身份验证,并使用用户名(第一个和最后一个)使用Firestore创建一个用户数据库。我可以创建用户,但无法同时创建数据库 这是我的SessionStore,用于注册和登录。通过注册,我想获取用户的名称并创建一个数据库。(下面没有代码,因为没有工作) 我是一个初学者,所以我希望能有一个详细的答案 非常感谢 import Firebase import Combine class SessionStore: ObservableObject { var didChange =

我想对用户进行身份验证,并使用用户名(第一个和最后一个)使用Firestore创建一个用户数据库。我可以创建用户,但无法同时创建数据库

这是我的SessionStore,用于注册和登录。通过注册,我想获取用户的名称并创建一个数据库。(下面没有代码,因为没有工作)

我是一个初学者,所以我希望能有一个详细的答案

非常感谢

import Firebase
import Combine

class SessionStore: ObservableObject {
    var didChange = PassthroughSubject<SessionStore, Never>()
    @Published var session: User? {didSet {self.didChange.send(self) }}
    var handle: AuthStateDidChangeListenerHandle?

    func listen() {
        handle = Auth.auth().addStateDidChangeListener({ (auth, user) in
            if let user = user {
                self.session = User(uid: user.uid, email: user.email)
            } else {
                self.session = nil
            }
        })
    }

    func signUp(email: String, password: String, handler: @escaping AuthDataResultCallback) {
        Auth.auth().createUser(withEmail: email, password: password, completion: handler)
    }

    func signIn(email: String, password: String, handler: @escaping AuthDataResultCallback) {
        Auth.auth().signIn(withEmail: email, password: password, completion: handler)
    }

    func signOut() {
        do {
            try Auth.auth().signOut()
            self.session = nil
        } catch {
            print("Error signing out")
        }
    }


    func unbind() {
        if let handle = handle {
            Auth.auth().removeStateDidChangeListener(handle)
        }
    }

    deinit {
        unbind()
    }
}
struct User {
    var uid: String
    var email: String?

    init(uid: String, email: String?) {
        self.uid = uid
        self.email = email
    }
}
    ```
导入Firebase
进口联合收割机
类SessionStore:ObservableObject{
var didChange=PassthroughSubject()
@已发布的var会话:用户?{didSet{self.didChange.send(self)}
变量句柄:AuthStateDidChangeListenerHandle?
func listen(){
handle=Auth.Auth().addStateDidChangeListener({(Auth,user)在
如果let user=user{
self.session=User(uid:User.uid,email:User.email)
}否则{
self.session=nil
}
})
}
func注册(电子邮件:字符串,密码:字符串,处理程序:@escaping AuthDataResultCallback){
Auth.Auth().createUser(带电子邮件:电子邮件,密码:密码,完成:处理程序)
}
func-signIn(电子邮件:String,密码:String,处理程序:@escaping-AuthDataResultCallback){
Auth.Auth().sign(使用电子邮件:电子邮件,密码:密码,完成:处理程序)
}
func签出(){
做{
请尝试Auth.Auth().signOut()
self.session=nil
}抓住{
打印(“注销错误”)
}
}
func unbind(){
如果let handle=handle{
Auth.Auth().removeStateDidChangeListener(句柄)
}
}
脱硝{
解除绑定()
}
}
结构用户{
变量uid:String
var电子邮件:字符串?
初始化(uid:String,email:String?){
self.uid=uid
self.email=电子邮件
}
}
```

Firebase身份验证管理用户身份验证-虽然它确实存储了一些联合身份提供商提供的附加信息(如配置文件图片URL),但它并不打算成为配置文件管理解决方案。如果您想存储有关用户的其他信息,可以使用Cloud Firestore或Firebase实时数据库来实现

Firebase用户对象只有有限数量的属性,主要用于允许身份验证提供者对用户进行身份验证。对于Swift,定义如下:

  • providerId
    -提供商标识符
  • uid
    -提供商为用户提供的唯一ID
  • displayName
    -用户的姓名(即他们的全名)
  • photoURL
    -用户个人资料照片的URL(如果认证提供商支持!)
  • 电子邮件
    -用户的电子邮件地址
  • phoneNumber
    -用户的电话号码,仅当用户通过电话号码认证时才可用
因此,您需要做的是:

  • 构建您的用户界面,以便用户能够提供他们的凭据(电子邮件/密码)以及您想要捕获的任何其他配置文件信息(如姓名、姓氏、居住地)
  • 使用
    Auth.Auth().createUser(电子邮件:电子邮件,密码:密码)
  • 如果该调用成功返回,请在Cloud Firestore或Firebase实时数据库中创建用户配置文件
  • 下面是一个示例实现

    别忘了:

  • 为您的项目下载
    GoogleService Info.plist
  • AppDelegate中调用
    FirebaseApp.configure()
  • 在项目中创建云Firestore数据库(使用Firebase控制台)
  • 用户界面
    //文件:ContentView.swift
    导入快捷键
    结构ContentView:View{
    @State var firstName:String=“”
    @状态变量lastName:String=“”
    @State var city:String=“”
    @State var email:String=“”
    @状态变量密码:String=“”
    @状态变量confirmPassword:String=“”
    @状态变量showSignUpForm=true
    @状态变量showDetails=false
    @ObservedObject var sessionStore=sessionStore()
    @状态变量配置文件:UserProfile?
    var body:一些观点{
    导航视图{
    VStack{
    如果self.showSignUpForm{
    形式{
    部分{
    TextField(“名字”,text:$firstName)
    .textContentType(.givenName)
    TextField(“姓氏”,text:$lastName)
    .textContentType(.familyName)
    TextField(“城市”,文本:$City)
    .textContentType(.addressCity)
    }
    部分{
    文本字段(“电子邮件”,文本:$Email)
    .textContentType(.emailAddress)
    .自动资本化(.none)
    SecureField(“密码”,文本:$Password)
    SecureField(“确认密码”,文本:$confirmPassword)
    }
    按钮(操作:{self.signUp()}){
    文本(“注册”)
    }
    }
    .navigationBarTitle(“注册”)
    }
    否则{
    形式{
    文本字段(“电子邮件”,文本:$Email)
    .textContentType(.emailAddress)
    .自动资本化(.none)
    SecureField(“密码”,文本:$Password)
    按钮(操作:{self.signIn()}){
    文本(“登录”)
    }
    }
    .navigationBarTitle(“登录”)
    }
    按钮(操作:{self.showSignUpForm.toggle()}){
    文本(self.showSignUpForm?“拥有帐户?改为登录。”:“还没有帐户?请单击此处改为注册。”)
    }
    }
    .sheet(显示:$showDetails){
    UserProfileView(userProfile:self.profile??userProfile(uid:,名字:,姓氏:,城市:))
    }
    }
    }
    func注册(){
    sessionStore.signUp(电子邮件:self.email,密码:self.password,名字:self.fir