程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了无法将 Apple 登录连接到 Firebase大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决无法将 Apple 登录连接到 Firebase?

开发过程中遇到无法将 Apple 登录连接到 Firebase的问题如何解决?下面主要结合日常开发的经验,给出你关于无法将 Apple 登录连接到 Firebase的解决方法建议,希望对你解决无法将 Apple 登录连接到 Firebase有所启发或帮助;

当我将 Sign In with Apple 连接到 Firebase 时,它​​出现错误消息“无法将类型为“LoginPopupVIEwController”的值分配给类型“ASAuthorizationControllerPresentationContextProvIDing?”它不会显示任何用户已登录 Firebase 控制台。

我遵循了本教程的第二部分:https://www.youtube.com/watch?v=BxQsdhglZtE

import Foundation
import UIKit
import Authenticationservices
import FirebaseAuth
import Firebase
import FirebaseFirestore
import CryptoKit

class LoginPopupVIEwController: UIVIEwController,ASAuthorizationControllerDelegate {
    
    @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() {
        performSignIn()
    }

    func performSignIn() {
        let request = createApplEIDrequest()
        let authorizationController = ASAuthorizationController(authorizationrequests: [request])
        authorizationController.delegate = self
        authorizationController.presentationContextProvIDer = self
        authorizationController.performrequests()
    }

    func createApplEIDrequest() -> ASAuthorizationopenIDrequest {
        let applEIDProvIDer = ASAuthorizationApplEIDProvIDer()
        let request = applEIDProvIDer.createrequest()
        request.requestedScopes = [.fullname,.email]

        let nonce = randomNonceString()
        request.nonce = sha256(noncE)
        currentNonce = nonce
        return request
    }
}

extension VIEwController: ASAuthorizationControllerDelegate {
    func authorizationController(controller: ASAuthorizationController,dIDCompleteWithAuthorization authorization: ASAuthorization) {
        if let applEIDCredential = authorization.credential as? ASAuthorizationApplEIDCredential {
            guard let nonce = currentNonce else {
                fatalError("InvalID state: A login callBACk was recIEved,but no login request was sent")
            }
            guard let applEIDToken = applEIDCredential.IDentityToken else {
                print("Unable to fetch IDentify token")
                return
            }
            guard let IDTokenString = String(data: applEIDToken,enCoding: .utf8) else {
                print("Unable to serialize token String from data: \(applEIDToken.deBUGDescription)")
            return
            }

                let credential = OauthprovIDer.credential(withProvIDerID: "apple.com",IDToken: IDTokenString,rawNonce: noncE)

                    Auth.auth().signIn(with: credential) { (authDataResult,error) in
                    if let user = authDataResult?.user {
                    print("Nice! You're Now signed in as \(user.uID),email: \(user.email ?? "unkNown")")
                    }
            }
        }
    }
}

extension VIEwController: ASAuthorizationControllerPresentationContextProvIDing {
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return self.vIEw.window!
    }
}



    // Adapted from https://auth0.com/docs/API-auth/tutorials/nonce#generate-a-cryptographically-random-nonce
    private func randomNonceString(length: Int = 32) -> String {
      precondition(length > 0)
      let charset: Array<Character> =
          Array("0123456789ABCDEFGHIJKLMnopQRstuVXYZabcdefghijklmnopqrstuvwxyz-._")
      var result = ""
      var remainingLength = length

      while remainingLength > 0 {
        let randoms: [UInt8] = (0 ..< 16).map { _ in
          var random: UInt8 = 0
          let errorCode = SecRandomcopyBytes(kSecRandomDefault,1,&random)
          if errorCode != errSecsuccess {
            fatalError("Unable to generate nonce. SecRandomcopyBytes Failed with Osstatus \(errorCodE)")
          }
          return random
        }

        randoms.forEach { random in
          if remainingLength == 0 {
            return
          }

          if random < charset.count {
            result.append(charset[Int(random)])
            remainingLength -= 1
          }
        }
      }

      return result
    }


    // Unhashed nonce.
    fileprivate var currentNonce: String?

    @available(iOS 13,*)
    private func sha256(_ input: String) -> String {
      let inputData = Data(input.utf8)
      let hashedData = SHA256.hash(data: inputData)
      let hashString = hashedData.compactMap {
        return String(format: "%02x",$0)
      }.joined()

      return hashString
    }

解决方法

您需要 LoginPopupViewController 以符合 ASAuthorizationControllerPresentationContextProviding

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

使用 FirebaseUI 更容易实现登录 Apple,我让 Auth 工作并绕过了预先构建的欢迎屏幕:

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 ?? "") ")
        }
    }

}

大佬总结

以上是大佬教程为你收集整理的无法将 Apple 登录连接到 Firebase全部内容,希望文章能够帮你解决无法将 Apple 登录连接到 Firebase所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。