Комбинация firebase и swiftUI поначалу довольно сложна, но вы поймете, что один и тот же шаблон используется в каждом отдельном проекте, не беспокойтесь. Просто следуйте моим инструкциям и настройте свой проект, вот наша стратегия.
- это может быть длинный ответ, но я хочу оставить его как ссылку для всех пользователей Firebase-SwiftUI, управляющих в стеке OverFlow. -
- Создание класса SessionStore, который предоставляет BindableObject , а также прослушивание аутентификации пользователей и обработку методов Auth и CRUD.
- Создание Модель для нашего проекта (вы это уже сделали)
- Добавление методов Auth в класс SessionStore.
- Прослушивание изменений и объединение вещей.
Начнем с SessionStore Класс: import SwiftUI import Firebase import Combine
class SessionStore : BindableObject {
var didChange = PassthroughSubject<SessionStore, Never>()
var session: User? { didSet { self.didChange.send(self) }}
var handle: AuthStateDidChangeListenerHandle?
func listen () {
// monitor authentication changes using firebase
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
// if we have a user, create a new user model
print("Got user: \(user)")
self.session = User(
uid: user.uid,
displayName: user.displayName
)
} else {
// if we don't have a user, set our session to nil
self.session = nil
}
}
}
// additional methods (sign up, sign in) will go here
}
Обратите внимание, что мы объявили, что наше свойство сеанса является необязательным User тип, который мы еще не определили. Давайте быстро сделаем один:
class User {
var uid: String
var email: String?
var displayName: String?
init(uid: String, displayName: String?, email: String?) {
self.uid = uid
self.email = email
self.displayName = displayName
}
}
Теперь, добавив signUp , signIn и signOut методы
class SessionStore : BindableObject {
// prev code...
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 () -> Bool {
do {
try Auth.auth().signOut()
self.session = nil
return true
} catch {
return false
}
}
}
Наконец, нам нужен способ прекратить прослушивание нашей аутентификации обработчик изменений.
class SessionStore : BindableObject {
// prev code...
func unbind () {
if let handle = handle {
Auth.auth().removeStateDidChangeListener(handle)
}
}
}
Наконец, Делаем наш просмотр содержимого:
import SwiftUI
struct ContentView : View {
@EnvironmentObject var session: SessionStore
var body: some View {
Group {
if (session.session != nil) {
Text("Hello user!")
} else {
Text("Our authentication screen goes here...")
}
}
}
}