一、先說(shuō)踩坑問(wèn)題
I.測(cè)試階段的問(wèn)題
- 配置后一直報(bào)錯(cuò)ASAuthorizationError.unknown
//走失敗函數(shù)
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
//code":1000,"domain":"com.apple.AuthenticationServices.AuthorizationError
}
-
解決方法
- 不要使用ASAuthorizationPasswordProvider().createRequest()!9涤凇!植康!
- ASAuthorizationPasswordProvider().createRequest()在第一次用蘋(píng)果登錄授權(quán)的時(shí)候會(huì)報(bào)錯(cuò)ASAuthorizationErrorUnknown 1000
- 但是如果你已經(jīng)授權(quán)成功登錄app了旷太,第二次登錄app授權(quán)時(shí)使用ASAuthorizationPasswordProvider創(chuàng)建request則不會(huì)報(bào)錯(cuò)unknow
II.提交Appstore的注意點(diǎn)
- 使用蘋(píng)果授權(quán)登錄后,不能強(qiáng)制要求用戶再使用手機(jī)號(hào)注冊(cè)销睁,否則會(huì)被拒供璧。
二、Xcode配置
1.添加sign In With Apple
點(diǎn)擊+冻记,搜索signinWithApple并添加
添加成功signInWithApple3
2.配置成功后Xcode會(huì)自動(dòng)添加環(huán)境變量SignInWithApple如圖:
-
添加成功后release和debug模式都支持SignInWithApple
image.png
3.登錄開(kāi)發(fā)者賬戶檢查是否配置成功
-
如果已經(jīng)在Xcode中設(shè)置好了Team和Bundle Identifier那么配置完2.中步驟睡毒,這塊會(huì)自動(dòng)配置好。
找到你項(xiàng)目所用Bundle Identifier點(diǎn)進(jìn)去
此處已經(jīng)勾選成功了
3.其他注意點(diǎn)
- 個(gè)人開(kāi)發(fā)者賬戶不支持Sign In With Apple功能
三冗栗、app端代碼實(shí)現(xiàn)-Swift
此處使用自定義蘋(píng)果登錄按鈕樣式演顾,設(shè)計(jì)規(guī)范參見(jiàn)Sign In With Apple 設(shè)計(jì)規(guī)范
也可使用蘋(píng)果自帶的樣式(網(wǎng)上一堆,自行搜索)
import AuthenticationServices
class LoginView: {
func createView() {
if #available(iOS 13.0, *) {
NotificationCenter.default.addObserver(self, selector: #selector(handleSignInWithAppleStateChanged(noti:)), name: ASAuthorizationAppleIDProvider.credentialRevokedNotification, object: nil)
let btn_apple = UIButton(type: .custom)
btn_apple.addTarget(self, action: #selector(appleLogininAction), for: .touchUpInside)
btn_apple.setBackgroundImage(UIImage(named: "youImage"), for: .normal)
self.addSubview(btn_apple)
btn_apple.snp.makeConstraints {
$0.width.equalTo(33)
}
}
}
@objc func appleLogininAction() {
if #available(iOS 13.0, *) {
//不要使用let requests = [ASAuthorizationAppleIDProvider().createRequest(), ASAuthorizationPasswordProvider().createRequest()]
//ASAuthorizationPasswordProvider().createRequest()在第一次用蘋(píng)果登錄授權(quán)的時(shí)候會(huì)報(bào)錯(cuò)ASAuthorizationErrorUnknown 1000
let requests = [ASAuthorizationAppleIDProvider().createRequest()]
let authorizationController = ASAuthorizationController(authorizationRequests: requests)
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
authorizationController.performRequests()
} else {
// 處理不支持系統(tǒng)版本
}
}
deinit {
if #available(iOS 13.0, *) {
NotificationCenter.default.removeObserver(self, name: ASAuthorizationAppleIDProvider.credentialRevokedNotification, object: nil)
}
}
}
@available(iOS 13.0, *)
extension LoginView: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding {
func authorizationController(controller:ASAuthorizationController, didCompleteWithAuthorization authorization:ASAuthorization) {
if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential{
// 蘋(píng)果用戶唯一標(biāo)識(shí)符贞瞒,該值在同一個(gè)開(kāi)發(fā)者賬號(hào)下的所有 App 下是一樣的偶房,開(kāi)發(fā)者可以用該唯一標(biāo)識(shí)符與自己后臺(tái)系統(tǒng)的賬號(hào)體系綁定起來(lái)。
let user = appleIDCredential.user
// 蘋(píng)果用戶信息 如果授權(quán)過(guò)军浆,可能無(wú)法再次獲取該信息
let fullName = appleIDCredential.fullName
let email = appleIDCredential.email
// 服務(wù)器驗(yàn)證需要使用的參數(shù)
let authorizationCode = String(data: appleIDCredential.authorizationCode!, encoding: String.Encoding.utf8)!
let identityToken = String(data: appleIDCredential.identityToken!, encoding: String.Encoding.utf8)!
// 用于判斷當(dāng)前登錄的蘋(píng)果賬號(hào)是否是一個(gè)真實(shí)用戶棕洋,取值有:unsupported、unknown乒融、likelyReal
let realUserStatus = appleIDCredential.realUserStatus;
//對(duì)接登錄接口掰盘,處理用戶登錄操作
}
}
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
if let e = error as? ASAuthorizationError {
var errorMsg = ""
switch e.code {
case .unknown:
errorMsg = "授權(quán)請(qǐng)求失敗未知原因"
case .canceled:
errorMsg = "用戶取消了授權(quán)請(qǐng)求"
case .invalidResponse:
errorMsg = "授權(quán)請(qǐng)求響應(yīng)無(wú)效"
case .notHandled:
errorMsg = "未能處理授權(quán)請(qǐng)求"
case .failed:
errorMsg = "授權(quán)請(qǐng)求失敗"
@unknown default:
errorMsg = "授權(quán)請(qǐng)求失敗其他原因"
}
}
}
func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
return UIApplication.shared.keyWindow!
}
}
四摄悯、附蘋(píng)果登錄logo圖(44*44)
icon_apple_whiteBoder.png
icon_apple_whiteBoder@2x.png
icon_apple_whiteBoder@3x.png
icon_apple_black.png
icon_apple_black@2x.png
icon_apple_black@3x.png
icon_apple_whiteboder_t.png
icon_apple_whiteboder_t@2x.png
icon_apple_whiteboder_t@3x.png
oc版參考
iOS 蘋(píng)果授權(quán)登錄(Sign in with Apple)系列之原生篇
其他相關(guān)參考
iOS 蘋(píng)果授權(quán)登錄(Sign in with Apple)系列之Apple Developer配置篇
iOS 蘋(píng)果授權(quán)登錄(Sign in with Apple)系列之原生篇
iOS 蘋(píng)果授權(quán)登錄(Sign in with Apple)系列之uniapp篇
iOS 蘋(píng)果授權(quán)登錄(Sign in with Apple)系列之服務(wù)端篇