簡體   English   中英

SwiftUI 從 authorizationController 異步返回 Bool

[英]SwiftUI return Bool from authorizationController async

我如何從使用 authorizationController 的 apple function 登錄中返回 Bool? 我一直在看 withCheckedThrowingContinuation 但沒有運氣。 我還看到了一些使用完成處理程序的示例,但我想使用異步。

func signInWithApple(withState state: SignInState) async -> Bool {
    let request = signInWithAppleRequest(withState: state)
    let authorizationController = ASAuthorizationController(authorizationRequests: [request])
    authorizationController.delegate = self
    authorizationController.performRequests()
}

func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    
    //...
        
        let credential = OAuthProvider.credential(withProviderID: "apple.com", idToken: idTokenString, rawNonce: nonce)
        
        switch state {
        case .signIn:
            Task {
                authenticationState = .authenticating
                do {
                    let result = try await Auth.auth().signIn(with: credential)
                    if result.additionalUserInfo?.isNewUser == true {
                        self.isNewUser = true
                    }
                    return true
                } catch {
                    self.authenticationState = .unauthenticated
                    print(error.localizedDescription)
                    return false
                }
            }
            
        case .reauth:
            Task {
                if let user = Auth.auth().currentUser {
                    do {
                        try await user.reauthenticate(with: credential)
                        return true
                    } catch {
                        print(error.localizedDescription)
                        return false
                    }
                }
            }
        }
    }
}

我沒有你所有的類型,所以這里有一個至少可以編譯的延續的簡單例子。

class 必須繼承自NSObject並采用ASAuthorizationControllerDelegate

延續設置在執行請求的同一 scope 中。

最重要的規則是: continuation 必須恰好恢復一次

import AuthenticationServices

class Authorization: NSObject, ASAuthorizationControllerDelegate {
    
    private var continuation : CheckedContinuation<ASAuthorization,Error>?
    
    func signInWithApple() async throws -> ASAuthorization {
        return try await withCheckedThrowingContinuation { continuation in
    
            self.continuation = continuation
            let appleIDProvider = ASAuthorizationAppleIDProvider()
            let request = appleIDProvider.createRequest()
            request.requestedScopes = [.fullName, .email]
            let authorizationController = ASAuthorizationController(authorizationRequests: [request])
            authorizationController.delegate = self
            authorizationController.performRequests()
        }
    }
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        continuation?.resume(returning: authorization)
    }
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        continuation?.resume(throwing: error)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM