SwiftUI:启动时检查用户身份验证
我很好奇如何在启动我的应用程序时检查用户身份验证。在我的应用程序代理中,我正在执行以下操作。SwiftUI:启动时检查用户身份验证,swift,xcode,swiftui,sign-in-with-apple,Swift,Xcode,Swiftui,Sign In With Apple,我很好奇如何在启动我的应用程序时检查用户身份验证。在我的应用程序代理中,我正在执行以下操作。loggedIn变量将根据用户当前是否使用“使用Apple登录”按钮登录进行设置 由于某种原因,上述loggedInvar总是返回false。我知道这与forUserID:userID有关不返回任何内容。但是它在其他视图中工作…通过创建一个函数来检查是否进行了身份验证,从而解决了这个问题。如果是,请将bool设置为true。然后选中bool以显示正确的视图。还必须创建一个分派组,以便提供程序方法可以在返回
loggedIn
变量将根据用户当前是否使用“使用Apple登录”按钮登录进行设置
由于某种原因,上述
loggedIn
var总是返回false。我知道这与forUserID:userID有关代码>不返回任何内容。但是它在其他视图中工作…通过创建一个函数来检查是否进行了身份验证,从而解决了这个问题。如果是,请将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()
}
}
}
}
用户首次登录后,应将生成的userID/loggedIn结果存储到UserDefaults(即UserDefaults.standard.setObject(forKey:“userID”)=[userID]。然后在启动应用程序时,只需检查UserDefaults是否存在。只有当用户单击SignIn按钮时,才应调用身份验证提供程序凭据。我将userID保存在以下内容中:UserDefaults.standard.set(userID,forKey:“userID”)
。我登录并保存它。然后撤销权限。然后遇到这个问题。@nicksarno检查UserDefaults是否存在的问题是,如果你撤销应用程序的Apple ID使用,UserDefaults仍然存在
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()
}
}
}
}