首页 > 解决方案 > 如何实现苹果登录到iOS12兼容项目

问题描述

我尝试在支持 iOS12 的 iOS 项目中实现 Sign in With Apple。由于 AuthenticationServices 相关声明仅从 iOS13 有效,我需要使用#available(iOS 13.0, *)... 分离 iOS13 或更高版本和 iOS12 的代码并吹。

我无法将 ASAuthorizationControllerDelegate 与 iOS12 或更低版本分开。它似乎#available(iOS 13.0, *)... 只能在方法中使用,但不能直接用于 swift 文件,所以我不能将我的 LoginViewController 与 ASAuthorizationControllerDelegate 仅用于 iOS13 或更高版本。

有什么帮助吗?

extension LoginViewController {
    
    @objc func didTapAppleButton() {
        
        guard #available(iOS 13.0, *) else { return }
        
        let provider: ASAuthorizationAppleIDProvider = .init()
        let request = provider.createRequest()
        request.requestedScopes = [.fullName, .email]
        
        let authController: ASAuthorizationController = .init(authorizationRequests: [request])
        authController.delegate = self
        authController.presentationContextProvider = self
        
        authController.performRequests()
    }
}

// This does not work.
// -> Error: Declaration is only valid at file scope
if #available(iOS 13.0, *) {
    
    extension LoginViewController: ASAuthorizationControllerDelegate {
        
        public func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
            
        }
        
        public func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
            
        }
    }

}

标签: iosswiftsign-in-with-apple

解决方案


你需要的是@available,不是if #availableif #available用于在特定的 iOS 版本上执行特定的代码路径。要声明特定类型或扩展仅在 iOS 13 上可用,您需要@available.

@available(iOS 13.0, *)
extension LoginViewController: ASAuthorizationControllerDelegate {
    
    public func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        
    }
    
    public func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        
    }
}

推荐阅读