我正在考虑开发应用程序并决定使用 SwiftUI 和 AWS Cognito,但是,所有教程似乎都使用 Storyboard -- Example
如何替换 ContentView 中的 viewDidLoad 函数?
override func viewDidLoad() {
super.viewDidLoad()
AWSMobileClient.default().initialize { (userState, error) in
if let userState = userState {
print("UserState: \(userState.rawValue)")
} else if let error = error {
print("error: \(error.localizedDescription)")
}
}
}
最佳答案
灵感来自:SwiftUI - How to access UINavigation Controller from NavView
在您的 ContentView 中,根据需要构建您的 View 。在此示例中,两个按钮触发从 AWSMobileClient 的默认登录。在这里,我展示了 Facebook 和 Google。
默认 AWSMobileClient.default().showSignIn(navigationController:..
需要的是 NavigationController。这就是使用 UIViewControllerRepresentable 的原因。
import SwiftUI
import AWSMobileClient
struct ContentView: View {
var body: some View {
let loginView = LoginViewController()
return VStack {
ZStack {
loginView
VStack {
Button(action: {
loginView.authenticateWithGoogle()
}) {
Text("Authenticate with Google")
}
Button(action: {
loginView.authenticateWithFacebook()
}) {
Text("Authenticate with Facebook")
}
}
}
}
}
}
struct LoginViewController: UIViewControllerRepresentable {
let navController = UINavigationController()
func makeUIViewController(context: Context) -> UINavigationController {
navController.setNavigationBarHidden(true, animated: false)
let viewController = UIViewController()
navController.addChild(viewController)
return navController
}
func updateUIViewController(_ pageViewController: UINavigationController, context: Context) {
}
func makeCoordinator() -> Coordinator {
return Coordinator(self)
}
class Coordinator: NSObject {
var parent: LoginViewController
init(_ loginViewController: LoginViewController) {
self.parent = loginViewController
}
}
func authenticateWithGoogle() {
let hostedUIOptions = HostedUIOptions(scopes: ["openid", "email"], identityProvider: "Google")
AWSMobileClient.default().showSignIn(navigationController: navController, hostedUIOptions: hostedUIOptions) { (userState, error) in
if let error = error as? AWSMobileClientError {
print(error.localizedDescription)
}
if let userState = userState {
print("Status: \(userState.rawValue)")
}
}
}
func authenticateWithFacebook() {
let hostedUIOptions = HostedUIOptions(scopes: ["openid", "email"], identityProvider: "Facebook")
AWSMobileClient.default().showSignIn(navigationController: navController, hostedUIOptions: hostedUIOptions) { (userState, error) in
if let error = error as? AWSMobileClientError {
print(error.localizedDescription)
}
if let userState = userState {
print("Status: \(userState.rawValue)")
}
}
}
}
关于ios - 亚马逊 Cognito 与 SwiftUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59038583/