PlatformHostApiImpl.swift 1.7 KB
import Foundation
import AuthenticationServices
import UIKit
import WebKit


/**
 * PlatformApi iOS implementation.
 *
 * 组装完整 User-Agent格式与 Android 端保持一致
 * `{systemWebViewUA} doublefeel/{versionCode}({versionName})(Apple##Apple##{model}; iOS{osVersion}; {height}x{width})(huawei)`
 */
final class PlatformHostApiImpl: PlatformHostApi {
    private var appleSignInCoordinator: AppleSignInCoordinator?

    func requestAppleSignIn(completion: @escaping (Result<AppleSignInModel?, any Error>) -> Void) {
        DispatchQueue.main.async { [weak self] in
            guard let self else {
                completion(.failure(PlatformHostApiError.deallocated))
                return
            }

            let provider = ASAuthorizationAppleIDProvider()
            let request = provider.createRequest()
            request.requestedScopes = [.fullName, .email]

            guard let presentationAnchor = AppleSignInCoordinator.currentPresentationAnchor() else {
                completion(.failure(PlatformHostApiError.missingPresentationAnchor))
                return
            }

            let coordinator = AppleSignInCoordinator(presentationAnchor: presentationAnchor) { [weak self] result in
                self?.appleSignInCoordinator = nil
                completion(result)
            }
            appleSignInCoordinator = coordinator

            let controller = ASAuthorizationController(authorizationRequests: [request])
            controller.delegate = coordinator
            controller.presentationContextProvider = coordinator
            controller.performRequests()
        }
    }
    
    func getFullUserAgent() throws -> String {
        return UserAgent.share.finalUA
    }
}