Sign in with Apple

Sign in with Apple 從登陸到服務(wù)器驗(yàn)證 看我這個(gè)鏈接蔓涧。

WWDC2019大會上件已,蘋果將支持使用AppleID進(jìn)行登錄。這篇文件記錄并介紹下Sing in with Apple這篇視頻中所介紹的內(nèi)容元暴,即使用AppleID登錄篷扩。

AppleID登錄的一些特性

  1. 簡化賬號的創(chuàng)建和登錄流程,無縫跨設(shè)備使用
  2. 開發(fā)者可以獲取到已驗(yàn)證過的郵箱作為登錄賬號或者與用戶進(jìn)行通信(注:用戶可以選擇隱藏真實(shí)郵箱茉盏,并使用蘋果提供的虛擬郵箱進(jìn)行授權(quán))
  3. 尊重用戶隱私鉴未,開發(fā)者只可獲取郵箱及姓名
  4. 反欺詐,使用機(jī)器學(xué)習(xí)等技術(shù)和其他信息鸠姨,幫助開發(fā)者判斷一個(gè)賬號是否真實(shí)
  5. 跨平臺
image.png

登錄流程圖:


image.png

代碼操作

  • 在項(xiàng)目中找到如圖所示位置铜秆,點(diǎn)擊并添加Sign in with Apple

這里需要注意的是,你的對應(yīng)證書里面也要添加對應(yīng)的權(quán)限

image.png

image.png
  • 導(dǎo)入框架 import AuthenticationServices

創(chuàng)建登錄按鈕(蘋果框架中提供了一個(gè)現(xiàn)成的)

// Add “Sign In with Apple” button to your login view
func setUpProviderLoginView() {
    let button = ASAuthorizationAppleIDButton()
    button.addTarget(self, action:#selector(handleAuthorizationAppleIDButtonPress),
for: .touchUpInside)
    self.loginProviderStackView.addArrangedSubview(button)
}

// Configure request, setup delegates and perform authorization request
@objc func handleAuthorizationButtonPress() {
    let request = ASAuthorizationAppleIDProvider().createRequest()
    request.requestedScopes = [.fullName, .email]
    let controller = ASAuthorizationController(authorizationRequests: [request])
    controller.delegate = self
    controller.presentationContextProvider = self
    controller.performRequests()
 }

ASAuthorization.Scope是一個(gè)枚舉讶迁,可以獲取到用戶的nameemail

extension ASAuthorization.Scope {
    @available(iOS 13.0, *)
    public static let fullName: ASAuthorization.Scope

    @available(iOS 13.0, *)
    public static let email: ASAuthorization.Scope
}

登錄方法中我們需要遵循兩個(gè)協(xié)議:ASAuthorizationControllerDelegateASAuthorizationControllerPresentationContextProviding

@available(iOS 13.0, *)
public protocol ASAuthorizationControllerDelegate : NSObjectProtocol {
    optional func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization)

    optional func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error)
}

@available(iOS 13.0, *)
public protocol ASAuthorizationControllerPresentationContextProviding : NSObjectProtocol {
    /** @abstract Return a view anchor that is most appropriate for athorization UI to be presented over.  This view will be used as a hint if a credential provider requires user interaction.
     */
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor
}

其中presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor方法我們需要返回一個(gè)window

注: public typealias ASPresentationAnchor = UIWindow

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

這時(shí)候你點(diǎn)擊按鈕應(yīng)該可以看到如下界面:


image.png
  • 登錄回調(diào)
    ASAuthorizationControllerDelegate這個(gè)協(xié)議中的兩個(gè)方法即為登錄成功及失敗的回調(diào)
func authorizationController(controller _: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    switch authorization.credential {
        case let appleIdCredential as ASAuthorizationAppleIDCredential:
            let userIdentifier = appleIdCredential.user
            let identityToken = appleIdCredential.identityToken
            let authCode = appleIdCredential.authorizationCode
            let realUserStatus = appleIdCredential.realUserStatus
        default:
            break
        }
  }
func authorizationController(_: ASAuthorizationController, didCompleteWithError error: Error) {
    // Handle error
}

如果用戶之前已經(jīng)登陸過连茧,那么我們可以提醒用戶輸入密碼直接登錄之前的賬號,代碼如下

func performExistingAccountSetupFlows() {
    let requests = [ASAuthorizationAppleIDProvider().createRequest(),
                        ASAuthorizationPasswordProvider().createRequest()]
        
    let controller = ASAuthorizationController(authorizationRequests: requests)
    controller.delegate = self
    controller.presentationContextProvider = self
    controller.performRequests()
}

然后修改回調(diào)方法巍糯,在上面的switch-case語句中添加一個(gè)case

case let passwordCredential as ASPasswordCredential:
        // Sign in using an existing iCloud Keychain credential.
        break
  • 檢查用戶登錄狀態(tài)
    這個(gè)操作我們可以放到AppDelegate中的app did finish launching中啸驯,因?yàn)樘O果告訴我們the api is very fast
let provider = ASAuthorizationAppleIDProvider()
provider.getCredentialState(forUserID: "currentUserIdentifier") { (credentialState, error) in
    switch(credentialState){
    case .authorized:
        // Apple ID Credential is valid
    case .revoked:
        // Apple ID Credential revoked, handle unlink
        fallthrough
    case .notFound:
        // Credential not found, show login UI
    default: break
    }
}
  • 監(jiān)聽用戶是否取消對app的登錄授權(quán)
// Register for revocation notification
let center = NotificationCenter.default
let name = ASAuthorizationAppleIDProvider.credentialRevokedNotification
let observer = center.addObserver(forName: name, object: nil, queue: nil) { (Notification) in
// Sign the user out, optionally guide them to sign in again
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枷颊,一起剝皮案震驚了整個(gè)濱河市漩蟆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苍日,老刑警劉巖宅楞,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件针姿,死亡現(xiàn)場離奇詭異袱吆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)搓幌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門杆故,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溉愁,你說我怎么就攤上這事处铛。” “怎么了拐揭?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵撤蟆,是天一觀的道長。 經(jīng)常有香客問我堂污,道長家肯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任盟猖,我火速辦了婚禮讨衣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘式镐。我一直安慰自己反镇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布娘汞。 她就那樣靜靜地躺著歹茶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪你弦。 梳的紋絲不亂的頭發(fā)上惊豺,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機(jī)與錄音禽作,去河邊找鬼尸昧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛旷偿,可吹牛的內(nèi)容都是我干的彻磁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼狸捅,長吁一口氣:“原來是場噩夢啊……” “哼衷蜓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尘喝,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤磁浇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后朽褪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體置吓,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡无虚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衍锚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片友题。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖戴质,靈堂內(nèi)的尸體忽然破棺而出度宦,到底是詐尸還是另有隱情,我是刑警寧澤告匠,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布戈抄,位于F島的核電站,受9級特大地震影響后专,放射性物質(zhì)發(fā)生泄漏划鸽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一戚哎、第九天 我趴在偏房一處隱蔽的房頂上張望裸诽。 院中可真熱鬧,春花似錦型凳、人聲如沸丈冬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至实夹,卻和暖如春橄浓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亮航。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工荸实, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缴淋。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓准给,卻偏偏與公主長得像,于是被迫代替她去往敵國和親重抖。 傳聞我的和親對象是個(gè)殘疾皇子露氮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容