【问题标题】:SwiftUI: Check user authentication upon launchSwiftUI:启动时检查用户身份验证
【发布时间】:2021-03-07 20:21:05
【问题描述】:

我很好奇如何在启动我的应用程序时检查用户身份验证。在我的应用程序委托中,我正在执行以下操作。 loggedIn 变量将根据用户当前是否使用“Sign In With Apple”按钮进行设置

extension UIApplication {
    func switchHostingController() {
        var loggedIn = false
        let provider = ASAuthorizationAppleIDProvider()
        let userID = UserDefaults.standard.object(forKey: "userID") as? String
        provider.getCredentialState(forUserID: userID!) { state, error in
          switch state {
          case .authorized:
            // Credentials are valid.
            loggedIn = true
            break
          case .revoked:
            // Credential revoked, log them out
            loggedIn = false
            break
          case .notFound:
            // Credentials not found, show login UI
            loggedIn = false
            break
          case .transferred:
            loggedIn = false
          @unknown default:
            loggedIn = false
          }
        }
        if (loggedIn == false)
        {
            let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
            window?.rootViewController = UIHostingController(rootView: ContentView())
        } else {
            let main = Main()
            let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
            window?.rootViewController = UIHostingController(rootView: main)
        }
    }
}

由于某种原因,上面的loggedIn var 总是返回 false。我知道这与forUserID: userID! 没有返回任何东西有关。但它适用于其他视图...

【问题讨论】:

  • 用户第一次登录后,您应该将生成的用户ID/登录结果存储到UserDefaults中(即UserDefaults.standard.setObject(forKey: "userID") = [userID]。然后当启动应用程序时,您只需检查 UserDefaults 是否存在。仅当用户单击登录按钮时才应调用 Auth 提供者凭据。
  • 我将用户 ID 保存在以下位置:UserDefaults.standard.set(userID, forKey: "userID")。我登录并保存。然后撤销权限。并遇到这个问题。
  • @nicksarno 检查 UserDefaults 是否存在的问题是,如果您撤销应用程序的 Apple ID 使用,UserDefaults 仍然存在

标签: swift xcode swiftui sign-in-with-apple


【解决方案1】:

通过创建一个函数来检查是否进行了身份验证来解决它。如果是这样,请将 bool 设置为 true。然后检查 bool 以显示正确的视图。还必须创建一个调度组,以便提供者方法可以在返回值之前完成。

struct MeusicApp: App {
    func checkit() -> Bool {
        let group = DispatchGroup()
            group.enter()
        let userID = UserDefaults.standard.object(forKey: "userID") as? String
        let provider = ASAuthorizationAppleIDProvider()
        var stateBool = false
        provider.getCredentialState(forUserID: userID ?? "") { [self] state, error in
          switch state {
          case .authorized:
            // Credentials are valid.
            stateBool = true
            group.leave()
            break
          case .revoked:
            // Credential revoked, log them out
            stateBool = false
            group.leave()
            break
          case .notFound:
            // Credentials not found, show login UI
            stateBool = false
            group.leave()
            break
          case .transferred:
            print("Transferred")
          @unknown default:
            stateBool = false
            group.leave()
          }
        }
        group.wait()
        return stateBool
    }
    var body: some Scene {
        WindowGroup {
            if checkit() {
                Main()
            } else {
                ContentView()
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2017-10-09
    • 2016-04-04
    • 2020-03-16
    相关资源
    最近更新 更多