【问题标题】:Amazon Cognito with SwiftUI带有 SwiftUI 的 Amazon Cognito
【发布时间】:2020-03-21 03:26:21
【问题描述】:

我正在考虑开发一个应用程序并决定使用 SwiftUI 和 AWS Cognito,但是,所有教程似乎都使用故事板 --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)")
            }
        }
    }

【问题讨论】:

  • 您是否正在尝试实现 AWS 身份验证/登录窗口?
  • 是的,类似于示例链接中显示的内容。

标签: ios swift amazon-cognito swiftui swift5


【解决方案1】:

灵感来自:SwiftUI - How to access UINavigation Controller from NavView

在您的 ContentView 中,随意构建您的视图。在此示例中,这两个按钮触发从 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)")
            }
        }
    }

}

【讨论】:

    【解决方案2】:

    登录视图由 AWSAuthUI 包处理。 AWS 最近发生了一些变化,因此您应该按照 Amplify 文档了解如何使用 AWSMobileClient。在您共享的链接中是手动调用以显示登录,我在整个示例中看不到任何情节提要连接。你试过这部分吗?如果您的视图附加了导航控制器,它应该显示登录。

    func showSignIn() {
        AWSMobileClient.sharedInstance().showSignIn(navigationController: self.navigationController!, { (userState, error) in
            if (error == nil) {
                DispatchQueue.main.async {
                    print("User successfully logged in")
                }
            }
        })
    }
    

    您还应该确保已将 AWSAuthUI pod 导入到您的项目中。

    target 'MyApp' do             ##Replace MyApp with your application name
    
    
    use_frameworks!
      pod 'AWSMobileClient', '~> 2.12.0'      # Required dependency
      pod 'AWSAuthUI', '~> 2.12.0'            # Optional dependency required to use drop-in UI
      pod 'AWSUserPoolsSignIn', '~> 2.12.0'   # Optional dependency required to use drop-in UI
    end
    

    【讨论】:

      猜你喜欢
      • 2018-06-27
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2020-10-16
      • 2020-09-02
      相关资源
      最近更新 更多