Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
Ios Firebase会话变量始终为零_Ios_Swift_Firebase_Firebase Authentication_Swiftui - Fatal编程技术网

Ios Firebase会话变量始终为零

Ios Firebase会话变量始终为零,ios,swift,firebase,firebase-authentication,swiftui,Ios,Swift,Firebase,Firebase Authentication,Swiftui,应用程序模式很简单:如果会话变量为nil,则会出现登录屏幕。如果成功输入密码和登录名,我们将创建一个新的用户模型,会话变量将不再为nil。然而,这并没有发生,因此,无论登录是否成功,登录屏幕总是出现在我们面前 (我在打开应用程序“get user:”时收到一条调试消息,这表明身份验证没有问题) ContentView.swift: import SwiftUI struct ContentView: View { @EnvironmentObject var session: Sess

应用程序模式很简单:如果会话变量为nil,则会出现登录屏幕。如果成功输入密码和登录名,我们将创建一个新的用户模型,会话变量将不再为nil。然而,这并没有发生,因此,无论登录是否成功,登录屏幕总是出现在我们面前

(我在打开应用程序“get user:”时收到一条调试消息,这表明身份验证没有问题)

ContentView.swift:

import SwiftUI

struct ContentView: View {
    @EnvironmentObject var session: SessionStore
    
    func getUser () {
          session.listen()
      }

    var body: some View {
        Group {
            if (session.session != nil) {
                Text("Hello user!")
              } else {
                SignInView()
              }
        }.onAppear(perform: getUser)
    }
}
import SwiftUI
import Firebase
import Combine

class SessionStore : ObservableObject {
    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,
                    email: user.email
                    
                )
            } else {
                // if we don't have a user, set our session to nil
                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 () -> Bool {
        do {
            try Auth.auth().signOut()
            self.session = nil
            return true
        } catch {
            return false
        }
    }
}
import SwiftUI

struct SignInView : View {

    @State var email: String = ""
    @State var password: String = ""
    @State var loading = false
    @State var error = false

    @EnvironmentObject var session: SessionStore

    func signIn () {
        loading = true
        error = false
        session.signIn(email: email, password: password) { (result, error) in
            self.loading = false
            if error != nil {
                self.error = true
            } else {
                self.email = ""
                self.password = ""
            }
        }
    }

    var body: some View {
        VStack {
            TextField("email address", text: $email)
            SecureField("password", text: $password)
            if (error) {
                Text("ahhh crap")
            }
            Button(action: signIn) {
                Text("Sign In")
            }
        }
    }
}
SessionStore.swift:

import SwiftUI

struct ContentView: View {
    @EnvironmentObject var session: SessionStore
    
    func getUser () {
          session.listen()
      }

    var body: some View {
        Group {
            if (session.session != nil) {
                Text("Hello user!")
              } else {
                SignInView()
              }
        }.onAppear(perform: getUser)
    }
}
import SwiftUI
import Firebase
import Combine

class SessionStore : ObservableObject {
    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,
                    email: user.email
                    
                )
            } else {
                // if we don't have a user, set our session to nil
                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 () -> Bool {
        do {
            try Auth.auth().signOut()
            self.session = nil
            return true
        } catch {
            return false
        }
    }
}
import SwiftUI

struct SignInView : View {

    @State var email: String = ""
    @State var password: String = ""
    @State var loading = false
    @State var error = false

    @EnvironmentObject var session: SessionStore

    func signIn () {
        loading = true
        error = false
        session.signIn(email: email, password: password) { (result, error) in
            self.loading = false
            if error != nil {
                self.error = true
            } else {
                self.email = ""
                self.password = ""
            }
        }
    }

    var body: some View {
        VStack {
            TextField("email address", text: $email)
            SecureField("password", text: $password)
            if (error) {
                Text("ahhh crap")
            }
            Button(action: signIn) {
                Text("Sign In")
            }
        }
    }
}

要使属性被视图观察,需要将其发布,而不是使用自定义发布器,如

class SessionStore : ObservableObject {
    @Published var session: User? = nil    // << here !!

// ... other code