问题描述
我的应用程序中启用了“使用Apple登录”功能。实施它之后,当我从Xcode运行该应用程序时,它运行良好。但是,当我将应用程序部署到TestFlight时,单击按钮似乎没有任何反应。在发布到TestFlight之前,有什么我应该从开发更改为生产的更改。其他所有社交登录都可以正常运行,例如Google和Facebook。
谢谢
解决方法
之所以发生这种情况,是因为您已经可以使用Apple登录。 请转到设置>单击您的Apple ID [第一个选项]>密码和安全性>使用Apple ID的应用程序。 您会在那找到您的应用程序。删除它,然后再试一次。会的。
每当用户使用Apple登录时,您都需要将其信息保存在任一钥匙串中。当用户第二次通过身份验证时,您将不会获得所有用户信息。 您需要从钥匙串中检索此信息。 还有一件事,请确保当用户的数据不可用时,用户会看到警报,否则Apple将由于无法登录而拒绝该应用程序。 使用此代码,根据您的要求进行更改。
// MARK: - Apple Sign In Delegate
@available(iOS 13.0,*)
extension SignupVC: ASAuthorizationControllerDelegate {
func setupAppleButton() {
var btnAuthorization = ASAuthorizationAppleIDButton(type: .signIn,style: .black)
if #available(iOS 13.2,*) {
btnAuthorization = ASAuthorizationAppleIDButton(type: .signUp,style: .black)
}
btnAuthorization.frame = CGRect(x: 16,y: 14,width: view.frame.size.width - 32,height: 44)
btnAuthorization.addTarget(self,action: #selector(appleLogin),for: .touchUpInside)
viewApple.addSubview(btnAuthorization)
}
@objc func appleLogin() {
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.fullName,.email]
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
authorizationController.performRequests()
}
/// Prepare requests for both Apple ID and password providers.
private func performExistingAccountSetupFlows() {
let requests = [ASAuthorizationAppleIDProvider().createRequest(),ASAuthorizationPasswordProvider().createRequest()]
// Create an authorization controller with the given requests.
let authorizationController = ASAuthorizationController(authorizationRequests: requests)
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
authorizationController.performRequests()
}
/// ASAuthorizationControllerDelegate function for authorization failed
func authorizationController(controller: ASAuthorizationController,didCompleteWithError error: Error) {
print(error.localizedDescription)
}
/// ASAuthorizationControllerDelegate function for successful authorization
func authorizationController(controller: ASAuthorizationController,didCompleteWithAuthorization authorization: ASAuthorization) {
if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
// Create an account as per your requirement
let appleUserFirstName = appleIDCredential.fullName?.givenName
let appleUserLastName = appleIDCredential.fullName?.familyName
let appleUserEmail = appleIDCredential.email
guard [appleUserFirstName,appleUserLastName,appleUserEmail].contains(nil) else {
keyChainHelper.appleUserID = appleIDCredential.user
keyChainHelper.appleUserFname = appleUserFirstName
keyChainHelper.appleUserLname = appleUserLastName
keyChainHelper.appleUserEmail = appleUserEmail
// Continue to your work
return
}
let appleIDProvider = ASAuthorizationAppleIDProvider()
appleIDProvider.getCredentialState(forUserID: appleIDCredential.user) { (credentialState,_) in
switch credentialState {
case .authorized:
guard let userID = self.keyChainHelper.appleUserID else {
print("data is not available.")
DispatchQueue.main.async {
self.showAlertToReset()
}
return }
if userID == appleIDCredential.user {
// Credential is valid
// Continiue to show 'User's Profile' Screen
//Get saved info from Keychain
// Continue to your work
//self.keyChainHelper.appleUserFname,lName: self.keyChainHelper.appleUserLname,email: self.keyChainHelper.appleUserEmail)
}
case .revoked:
// Credential is revoked.
// Show 'Sign In' Screen
break
case .notFound:
// Credential not found.
// Show 'Sign In' Screen
break
default:
break
}
}
}
}
func showAlertToReset() {
let alert = ADDAlertController(title: "",message:"Please reset account permission from Password & Security to Sign up with Apple.\nTap Settings > [your name] > Password & Security > Apple ID logins\n\nSwipe left on your app,tap delete > Stop using.",preferredStyle: .alert)
alert.addAction(UIAlertAction(title: strings.ok().uppercased(),style: .default,handler: nil))
present(alert,animated: true,completion: nil)
}
}
@available(iOS 13.0,*)
extension SignupVC: ASAuthorizationControllerPresentationContextProviding {
// For present window
func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
return view.window!
}
}