Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 无法将Apple登录连接到Firebase_Swift_Firebase_Authentication_Uiviewcontroller_Apple Sign In - Fatal编程技术网

Swift 无法将Apple登录连接到Firebase

Swift 无法将Apple登录连接到Firebase,swift,firebase,authentication,uiviewcontroller,apple-sign-in,Swift,Firebase,Authentication,Uiviewcontroller,Apple Sign In,当我将Apple登录连接到Firebase时,会出现一条错误消息“无法将类型为“LoginPoopViewController”的值分配给类型为“AsAuthorizationControllerPresentationContextProvising”的用户”,它不会显示任何已登录Firebase控制台的用户 我遵循了本教程的第二部分: 导入基础 导入UIKit 导入身份验证服务 导入FirebaseAuth 进口火基 导入FirebaseFirestore 导入加密套件 类LoginPopp

当我将Apple登录连接到Firebase时,会出现一条错误消息“无法将类型为“LoginPoopViewController”的值分配给类型为“AsAuthorizationControllerPresentationContextProvising”的用户”,它不会显示任何已登录Firebase控制台的用户

我遵循了本教程的第二部分:

<代码>导入基础 导入UIKit 导入身份验证服务 导入FirebaseAuth 进口火基 导入FirebaseFirestore 导入加密套件 类LoginPoppupViewController:UIViewController、ASAuthorizationControllerDelegate{ @iAction func doneBtn(uu发送方:任何){ 驳回(动画:真,完成:无) } 重写func viewDidLoad(){ super.viewDidLoad() setupSignInButton() } func setupSignInButton(){ let button=ASAuthorizationAppleIDButton(类型:.signIn,样式:.white) button.addTarget(self,action:#选择器(handleSignInWithAppleTapped),用于:.touchUpInside) button.frame.size=CGSize(宽度:300.0,高度:40.0) button.center=view.center view.addSubview(按钮) } @objc func handleSignInWithAppleTapped(){ performSignIn() } 履行职能(){ let request=createAppleIDRequest() 让authorizationController=ASAuthorizationController(authorizationRequests:[请求]) authorizationController.delegate=self authorizationController.presentationContextProvider=self authorizationController.performRequests() } func createAppleIDRequest()->ASAuthorizationOpenIDRequest{ 让appleIDProvider=ASAuthorizationAppleIDProvider() let request=appleIDProvider.createRequest() request.requestedScopes=[.fullName,.email] 设nonce=randomnocresting() request.nonce=sha256(nonce) currentNonce=nonce 退货申请 } } 扩展视图控制器:ASAuthorizationControllerDelegate{ func authorizationController(控制器:ASAuthorizationController,已完成授权:ASAuthorization){ 如果让appleIDCredential=authorization.credential as?ASAuthorizationAppleIDCredential{ 保护let nonce=当前nonce else{ fatalError(“无效状态:收到登录回调,但未发送登录请求”) } guard let appleIDToken=appleIDCredential.identityToken else{ 打印(“无法获取标识令牌”) 返回 } guard let idTokenString=String(数据:appleIDToken,编码:.utf8)else{ 打印(“无法从数据中序列化令牌字符串:\(appleIDToken.debugDescription)”) 返回 } 让credential=OAuthProvider.credential(withProviderID:“apple.com”,idToken:idTokenString,rawnice:nonce) Auth.Auth().signIn(带:凭证){(authDataResult,error)in 如果let user=authDataResult?.user{ 打印(“很好!您现在以\(user.uid)身份登录,电子邮件:\(user.email??“未知”)) } } } } } 扩展视图控制器:AsAuthorizationControllerPresentationContextProvising{ func presentationAnchor(对于控制器:ASAuthorizationController)->ASPresentationAnchor{ 返回self.view.window! } } //改编自https://auth0.com/docs/api-auth/tutorials/nonce#generate-a-加密-随机-nonce private func RandomNonCrestring(长度:Int=32)->字符串{ 前提条件(长度>0) let字符集:数组= 阵列(“0123456789ABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVXYZ-。) var result=“” var remainingLength=长度 当剩余长度大于0时{ 让randoms:[UInt8]=(0..<16).map{uu}in 随机变量:UInt8=0 让errorCode=SecRandomCopyBytes(kSecRandomDefault、1和random) 如果errorCode!=errSecSuccess{ fatalError(“无法生成nonce.SecRandomCopyBytes,OSStatus\(错误代码)”失败) } 返回随机数 } randoms.forEach{random in 如果剩余长度==0{ 返回 } 如果随机String{ 让inputData=数据(input.utf8) 让hashedData=SHA256.hash(数据:inputData) 让hashString=hashedData.compactMap{ 返回字符串(格式:'%02x',$0) }.加入 返回哈希字符串 }
您需要
LoginPoopViewController
以符合
授权控制器PresentationContextProvising

extension LoginPopupViewController: ASAuthorizationControllerPresentationContextProviding {
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return self.view.window!
    }
}

您需要
loginpoppupViewController
以符合
asAuthorizationControllerPresentationContextProvising

extension LoginPopupViewController: ASAuthorizationControllerPresentationContextProviding {
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return self.view.window!
    }
}

使用FirebaseUI与Apple实现登录要容易得多,我获得了授权,绕过了预构建的欢迎屏幕:

import Foundation
import UIKit
import AuthenticationServices
import FirebaseAuth
import Firebase
import FirebaseFirestore
import CryptoKit
import FirebaseUI

class LoginPopupViewController: UIViewController, ASAuthorizationControllerDelegate, FUIAuthDelegate {
    
    @IBAction func doneBtn(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        setupSignInButton()
    }

    func setupSignInButton() {
        let button = ASAuthorizationAppleIDButton(type: .signIn, style: .white)
        button.addTarget(self, action: #selector(handleSignInWithAppleTapped), for: .touchUpInside)
        button.frame.size = CGSize(width: 300.0, height: 40.0)
        button.center = view.center
        view.addSubview(button)
    }

    @objc func handleSignInWithAppleTapped() {
                if let authUI = FUIAuth.defaultAuthUI() {
                    authUI.providers = [FUIOAuth.appleAuthProvider()]
                    authUI.delegate = self
                    authUI.signIn(withProviderUI: FUIOAuth.appleAuthProvider(), presenting: self, defaultValue: nil)
//                    let authViewController = authUI.authViewController()
//                    self.present(authViewController, animated: true)
    }
    }
    
    @objc(authUI:didSignInWithAuthDataResult:error:) func authUI(_ authUI: FUIAuth, didSignInWith authDataResult: AuthDataResult?, error: Error?) {
        dismiss(animated: true, completion: nil)
        if let user = authDataResult?.user {
            print("Nice! You've signed in as \(user.uid). Your email is: \(user.email ?? "") ")
        }
    }

}

使用FirebaseUI与Apple实现登录要容易得多,我获得了授权,绕过了预构建的欢迎屏幕:

import Foundation
import UIKit
import AuthenticationServices
import FirebaseAuth
import Firebase
import FirebaseFirestore
import CryptoKit
import FirebaseUI

class LoginPopupViewController: UIViewController, ASAuthorizationControllerDelegate, FUIAuthDelegate {
    
    @IBAction func doneBtn(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        setupSignInButton()
    }

    func setupSignInButton() {
        let button = ASAuthorizationAppleIDButton(type: .signIn, style: .white)
        button.addTarget(self, action: #selector(handleSignInWithAppleTapped), for: .touchUpInside)
        button.frame.size = CGSize(width: 300.0, height: 40.0)
        button.center = view.center
        view.addSubview(button)
    }

    @objc func handleSignInWithAppleTapped() {
                if let authUI = FUIAuth.defaultAuthUI() {
                    authUI.providers = [FUIOAuth.appleAuthProvider()]
                    authUI.delegate = self
                    authUI.signIn(withProviderUI: FUIOAuth.appleAuthProvider(), presenting: self, defaultValue: nil)
//                    let authViewController = authUI.authViewController()
//                    self.present(authViewController, animated: true)
    }
    }
    
    @objc(authUI:didSignInWithAuthDataResult:error:) func authUI(_ authUI: FUIAuth, didSignInWith authDataResult: AuthDataResult?, error: Error?) {
        dismiss(animated: true, completion: nil)
        if let user = authDataResult?.user {
            print("Nice! You've signed in as \(user.uid). Your email is: \(user.email ?? "") ")
        }
    }

}

感谢您的回答,该应用程序运行,但它仍然没有显示在用户身份验证上。有什么想法吗?谢谢你的回答,应用程序运行了,但它仍然没有在用户身份验证中显示出来。有什么想法吗?