大佬教程收集整理的这篇文章主要介绍了无法将 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,请注明来意。