如果新用户注册成功,如何打开一个屏幕,当现有用户使用 SwiftUI 成功登录时如何打开另一个屏幕?

Posted

技术标签:

【中文标题】如果新用户注册成功,如何打开一个屏幕,当现有用户使用 SwiftUI 成功登录时如何打开另一个屏幕?【英文标题】:How open one screen if a new user registered successfully, and other when existing user logged in succesfully using SwiftUI? 【发布时间】:2020-04-18 09:34:09 【问题描述】:

我正在使用 Firebase Auth 通过电子邮件和密码处理登录和注册页面。

成功完成了什么:

如果会话(登录或注册)不是nil,则用户转到欢迎返回视图。

接下来是问题:

我不希望新用户去“欢迎回来”查看,而是希望他在按下“注册”按钮后(会话不是nil 转到新视图 - “上传您的照片视图”

我的会话存储类 (@ObservableObject):

 @Published var session: User? didSetself.didChange.send(self)
 var didChange = PassthroughSubject<SessionStore, Never>()
var handle: AuthStateDidChangeListenerHandle?
let currentuser = Auth.auth().currentUser




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, fullname: String, username: 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) (res,err) in
        if err != nil
            return
        

    

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()


func addUsername(username: String)
    session?.username = username

func addFullname(fullname: String)
    session?.fullname = fullname



class User:ObservableObject

var uid: String
var email: String?
var username: String?
var fullname: String?

    init(uid:String, email:String?)

    self.uid = uid
    self.email = email




我的内容视图看起来像这样:

组 if (session.session != nil)

                Button(action: 
                    try! Auth.auth().signOut()
                    UserDefaults.standard.set(false, forKey: "status")
                    NotificationCenter.default.post(name: NSNotification.Name("statusChange"), object: nil)
                )
                    Text("Log out")
                
                ExploreView()

            else

                        AuthView()

            
        .onAppear(perform: getUser)

【问题讨论】:

嗨,Maksym,你能澄清你的问题吗?我不确定你想要达到什么目标。关于您的SessionStore:您不需要直接使用PassthroughSubject - 实现ObservableObject 并使用@Published 标记您想要观察的任何属性就足够了。查看 peterfriese.dev/replicating-reminder-swiftui-firebase-part3 了解使用 Sign in with Apple 的 Firebase 身份验证实施,了解 SwiftUI 和 Firebase 的一些最佳实践。 嘿,彼得!感谢您的回答!我的目标是向新用户和老用户展示不同的视图。但现在如果他们已登录,我只能向他们显示一个屏幕。 让老用户进入主页(如果已登录)和新用户(刚刚注册的用户)去添加照片屏幕。我只是不知道如何将它们分开来实现它。 您是否考虑过使用lastSignInDatecreationDate?在此处查看文档:firebase.google.com/docs/reference/swift/firebaseauth/api/… 谢谢,还没有,但会尝试! 【参考方案1】:

一种可能的解决方案是双向绑定,仅在注册成功时触发(因此它是那一刻的第一次登录)。

编辑您的评论:在 signUp-func 中,当 signUp 成功时,您将变量设置为“true”,PhotoUploadView 将弹出。

在 User 类中添加一个变量(然后可以在您的变量会话中使用):

    @Published var firstLogin = false

注册成功后在signUp-func中更改firstLogin:

session.firstLogin = true

在 ContentView 中使用类似的东西:

//.....
else
if session.firstLogin 
         PhotoUploadView()
        

在 PhotoUploadView 中完成后,将 session.firstLogin 设置为 false。

【讨论】:

嗨,@Kuhlemann!非常感谢您的回答!我刚刚上传了我的 ContentView 代码。 查看我的更新答案以了解如何做。 一直在尝试解决它们,但每次都只会出现更多。这些是我在 ContentView 中收到的错误:1)无法将“Binding”类型的值转换为预期的条件类型“Bool”2)“SessionStore”类型的值没有使用根类型的键路径的动态成员“secondLogin” 'SessionStore' 3) 引用下标 'subscript(dynamicMember:)' 需要包装器 'EnvironmentObject.Wrapper' 制作了 2 个变量:firstLogin - 用于注册和 secondLogin - 用于登录。每次我尝试将 false 状态更改为 true注册功能,出现此错误('SessionStore.User'类型的值没有成员'firstLogin') 抱歉,这些是与您的原始问题没有直接关系的进一步问题。我不能只用你的 cmets 来解决这个问题,而且只需要一小段代码(或者在这种情况下没有新代码)。但另一个提示:您不需要 secondLogin 变量,因为如果 firstLogin 为 false,则根据定义,它的登录 >= 2nd login。如果我的回答有帮助,如果您将其标记为已接受并投票,我将不胜感激。

以上是关于如果新用户注册成功,如何打开一个屏幕,当现有用户使用 SwiftUI 成功登录时如何打开另一个屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

新注册用户将被重定向到密码重置屏幕

注册成功后如何使按钮可见?

当用户不在聊天中时如何显示发送的最后一条消息?

当用户在屏幕上滑动手指时,如何使我的页面滑动?

FireBaseUI Auth - 如何知道帐户是来自新注册用户还是现有用户?

当用户将手从屏幕上移开时,如何使 Recycler View 滚动缓慢而流畅?