在 SwiftUI 中打开 Google 登录屏幕

jwk*_*knz 9 google-authentication ios swift google-signin swiftui

我正在使用 Google 登录屏幕和 swiftUI,但我一直在我的日志中收到一堆我不太理解的消息 - 现在我可以使用这些日志,但我遇到的问题是我可以不要多次调用同一个函数...

import SwiftUI
import GoogleSignIn

class GoogleStuff: UIViewController, GIDSignInDelegate, ObservableObject {
    
    var googleSignIn = GIDSignIn.sharedInstance()
    var googleId = ""
    var googleIdToken = ""
    var googleFirstName = ""
    var googleLastName = ""
    var googleEmail = ""
    var googleProfileURL = ""
    
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        
        guard user != nil else {
            print("Uh oh. The user cancelled the Google login.")
            return
        }
        
        print("TOKEN => \(user.authentication.idToken!)")

        
    }
    
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
        
        guard user != nil else {
            print("Uh oh. The user cancelled the Google login.")
            return
        }
        
        print("TOKEN => \(user.authentication.idToken!)")
        
    }
}

struct ContentView: View {
    
    let googleSignIn = GIDSignIn.sharedInstance()
    
    @ObservedObject var myGoogle = GoogleStuff()
    
    @State private var signedIn = false
    @State private var buttonLabel = "Google Sign In"
            
    var body: some View {
        VStack {
                             
            Button(action: {
                self.signedIn.toggle()
                self.buttonLabel = self.signedIn ? "Google Sign In" : "Google Sign Out"
                
                self.googleSignIn?.presentingViewController = UIApplication.shared.windows.last?.rootViewController
                self.googleSignIn?.clientID = "MY_TOKEN_GOES_HERE" //It is just a playground for now
                self.googleSignIn?.delegate = self.myGoogle
                self.googleSignIn?.signIn()
            }) {
                HStack {
                    Image("GLogo")
                        .resizable()
                        .frame(width: 40, height: 40, alignment: .center)
                    Text(buttonLabel)
                    .foregroundColor(.blue)
                    .font(.title)
                    .font(.custom("Roboto-Thin", size: 20))
                }
                .padding()
                .border(Color.black, width: 3)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误消息是:

2020-01-03 10:25:14.490522+1300 gsignin[34333:10734362] [AXRuntimeCommon] 此类“SwiftUI.AccessibilityNode”不是已知的可序列化元素,将其作为可访问性元素返回可能会导致崩溃

2020-01-03 10:25:14.789926+1300 gsignin[34333:10734511] [AXRuntimeCommon] 未知客户端:gsignin

2020-01-03 10:25:16.539753+1300 gsignin[34333:10734362] 键盘无法呈现视图控制器(试图呈现<SFAuthenticationViewController: 0x7f8a8a842200>

问题 1:我是否应该担心:[AXRuntimeCommon] Unknown client: gsignin

问题 2:收到此消息后,登录屏幕第一次出现,但之后的任何时间都不会出现...Keyboard cannot present view controllers (attempted to present <SFAuthenticationViewController: 0x7f8a8a842200>)

如何修复这些消息?目前我一无所获。

附注。我不介意做更多的阅读/研究,但请保持友善 - 我是 swift 的新手 :-D

Tom*_*lak 21

更改自:

self.googleSignIn?.presentingViewController = 
UIApplication.shared.windows.last?.rootViewController
Run Code Online (Sandbox Code Playgroud)

到:

self.googleSignIn?.presentingViewController = 
UIApplication.shared.windows.first?.rootViewController
Run Code Online (Sandbox Code Playgroud)

让它工作。

  • 哇谢谢!这对我有用。您能解释一下为什么这有效吗? (2认同)

Rev*_*her 1

我真的希望有人能告诉我我对此错了,但 SwiftUI 尚不支持您编写的 Google 登录代码类型。因此,要使其正常工作,请使用以下结构:

struct google : UIViewRepresentable {

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

        let button = GIDSignInButton()
        GIDSignIn.sharedInstance()?.presentingViewController = UIApplication.shared.windows.last?.rootViewController
        return button
    }

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

    }
}
Run Code Online (Sandbox Code Playgroud)

然后,放置该行:

google()
Run Code Online (Sandbox Code Playgroud)

在您希望按钮出现的 VStack 中。

另外,文档说你应该:

import Firebase
Run Code Online (Sandbox Code Playgroud)