Swift 无法将Apple登录连接到Firebase
当我将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{ 返回 } 如果随机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
您需要
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 ?? "") ")
}
}
}
感谢您的回答,该应用程序运行,但它仍然没有显示在用户身份验证上。有什么想法吗?谢谢你的回答,应用程序运行了,但它仍然没有在用户身份验证中显示出来。有什么想法吗?