在 SwiftUI 中使用 google 帐户登录后是不是有任何改变视图的方法?

Posted

技术标签:

【中文标题】在 SwiftUI 中使用 google 帐户登录后是不是有任何改变视图的方法?【英文标题】:Is there anyway to change your view after logging in with a google account in SwiftUI?在 SwiftUI 中使用 google 帐户登录后是否有任何改变视图的方法? 【发布时间】:2019-12-11 14:40:34 【问题描述】:

在我的应用程序中,我让用户使用他们的 google 帐户登录,以便将应用程序的其余部分个性化到他们的帐户,但是在他们登录后,我希望它自动更改视图并转到主屏幕,但我没有找到了一种让它工作的方法,而无需在登录后点击单独的按钮来更改视图。

这是登录页面的代码。我目前正在使用NavigationLink 更改视图,但我想知道一种在用户登录后自动执行此操作的方法。

struct LoginPage: View 

    var body: some View 

        //Login Page
        NavigationView
            ScrollView 
            VStack 
            VLargeCardView(image: "pad22finalsf", category: "Login", heading: "Welcome to PV Pocket!", author: "PAD22")
            //Google Sign In Button
            google()
                .frame(width: 200, height: 50)
            //Switch to main view after login
            NavigationLink(destination: MainView()) 
               ZStack 
                Rectangle()
                      .frame(width: 300, height: 50)
                      .cornerRadius(20)
                    .foregroundColor(.orange)
                  Text("Click here after sign in!")
                     .foregroundColor(.primary)
                     .font(Font.system(size: 25))
                  
                
                .navigationBarHidden(true) .navigationBarTitle("")
                
            
        
    

如果有帮助,这里还有 Google 登录按钮的代码。

//Creates Google Sign In instance
struct google : UIViewRepresentable 

    @EnvironmentObject var settings: UserSettings

    func makeUIView(context: UIViewRepresentableContext<google>) -> GIDSignInButton 

        //Create Google Sign In Button
        let button = GIDSignInButton()
        button.colorScheme = .dark
        button.style = .wide

        //Add Scopes to Login
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/clas-s-room.courses")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/clas-s-room.coursework.me")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/calendar")

        //Restore Previous Login if it exists
        GIDSignIn.sharedInstance()?.restorePreviousSignIn()

        GIDSignIn.sharedInstance()?.presentingViewController = UIApplication.shared.windows.last?.rootViewController

        return button

    
    func updateUIView(_ uiView: GIDSignInButton, context: UIViewRepresentableContext<google>) 

    



任何帮助或信息将不胜感激!

【问题讨论】:

NavigationLink 可以通过编程方式激活,查找带有isActive 的构造函数,然后隐藏 - 使用EmptyView() 作为标签。 @Asperi,你的建议看起来不错。我是否理解正确:如果我将拥有@State var isActive 并像你写的那样使用它,我会自动到达目的地,同时再次打开这个视图(如果 var 当然是true)? @Александр-Грабовский,可以在this my answer看到NavigationLink的这种用法。 【参考方案1】:

我的身份验证/注册解决方案包括几个部分:

    有一些可观察到的final static class 数据,我可以从UserDefaults 获取。我认为您想保留一些数据并对其进行更改:
import SwiftUI

final class UserData: ObservableObject 

    @Published var userName: String? 
        didSet 
            UserDefaults.standard.set(userName, forKey: "userName")
        
    

    init() 
        self.userName = UserDefaults.standard.string(forKey: "userName")
    


    我的第一个 Home 视图有 UserDataEnvironmentObject 并将其设置在 SceneDelegate 类中:
class SceneDelegate: UIResponder, UIWindowSceneDelegate 
   // other staff

   func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)  
        let homeView = Home()
            .environmentObject(UserData())
        // ...
        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene 
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: homeView)
            self.window = window
            window.makeKeyAndVisible()
        
    
    // ...

    Home 视图显示 LoginPageMainView 取决于 UserData
struct Home: View 

    @EnvironmentObject var userData: UserData

    var body: some View 

        if self.userData.userName == nil 
            return AnyView(LoginPage())
        else 
            return AnyView(MainView())
        

    


    所以在这个解决方案中你只需要在LoginPage中设置userName
struct LoginPage: View 
    // your login view has the same user data, so user name changes for Home view too
    @EnvironmentObject var userData: UserData
    var body: some View 

        VStack 
            VLargeCardView(image: "pad22finalsf", category: "Login", heading: "Welcome to PV Pocket!", author: "PAD22")
            //Google Sign In Button
            google()
                .frame(width: 200, height: 50)
            // I don't know, how you get data, I didn't work with google. so quick code is:
                .onTapGesture 
                    // when you set userName, in Home view will show MainView at this moment
                    self.userData.userName = "Steve Jobs"
                
               
    

【讨论】:

以上是关于在 SwiftUI 中使用 google 帐户登录后是不是有任何改变视图的方法?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftUI、Combine 和 Firebase,我如何在将用户的帐户链接到电子邮件/密码之前验证用户是不是已匿名登录?

如何在JMeter中使用Google帐户登录

使用不同帐户的 Google 登录在应用程序中崩溃

如何在使用 Google 登录按钮时不将 Google 帐户添加到 Android 手机

Firebase 使用 Google 帐户覆盖登录

如何在 C# 中使用服务帐户登录 Google API - 凭据无效