胡东东博客

Sign In with Apple - iOS13的Apple登录


在iOS13中提到,如果你的应用使用了QQ登录或者微信登录等第三方快捷登录的话,也需要支持apple登录。

这个apple登录只支持iOS13和以后更新的系统,所以在接入的时候是要判断系统版本,如果太低的话是无效的。

openid说明

如果你曾经接入过QQ登录或者微信登录,那么apple登录的整个流程你会再熟悉不过了。发起登录 》 用户授权 》 返回给app用户的openid,然后app拿这个openid去创建用户或者获取用户资料。

apple登录对于所有设备,比如iPhone、iPad、Mac,只要是同一个开发者账号的,同一个用户在所有软件中返回的openid都是相同的,类似于QQ登录和微信登录中的unionid

一、开始接入

1.1、布局登录授权按钮

iOS13中,新添加了一个按钮类型ASAuthorizationAppleIDButton,通过导入import AuthenticationServices 这个头文件即可,然后像创建普通按钮一样创建布局这个按钮即可,用户点击这个按钮就会发起apple登录请求

//导入头文件
import AuthenticationServices

//继承发起登录之后的回调代理
class LZAppleIDLoginPopView: UIView, ASAuthorizationControllerDelegate

//创建登录按钮
private lazy var mConfirmButton: ASAuthorizationAppleIDButton = {
        let tButton = ASAuthorizationAppleIDButton()
        return tButton
}()

//根据需要布局位置和大小
self.mContentView.addSubview(self.mConfirmButton)
self.mConfirmButton.snp.makeConstraints { (make) in
    make.left.equalToSuperview().offset(30)
    make.right.equalToSuperview().offset(-30)
    make.height.equalTo(40)
    make.bottom.equalToSuperview().offset(-20)
}

//按钮绑定点击事件
self.mConfirmButton.addTarget(self, action: #selector(p_startHandleAuthor), for: UIControl.Event.touchUpInside)

这个按钮已经有固定的标题,你可以在创建时通过下面的初始化函数设置黑白类型,去更好的适配,其他更多自定义的设置还没有。

init(type: ASAuthorizationAppleIDButton.ButtonType, style: ASAuthorizationAppleIDButton.Style)

苹果官网提到了这黑白类型的样式,有兴趣可以去看看sign-in-with-apple/overview

1.2、发起登录请求

上面写了按钮点击事件,这里点击事件的实现就是发起登录请求

//开始登录
@objc func p_startHandleAuthor() -> Void {
            let appleIDProvider = ASAuthorizationAppleIDProvider()
            let request = appleIDProvider.createRequest()
            request.requestedScopes = [.fullName, .email]
            let authorizationController = ASAuthorizationController(authorizationRequests: [request])
            //设置回调的代理
            authorizationController.delegate = self
            //指定授权的弹出界面,不设置也可以
//          authorizationController.presentationContextProvider = self

            authorizationController.performRequests()
}

1.3、登录之后的回调

登录之后,会在成功回调中返回给app用户的信息,包含了以下信息

//MARK:ASAuthorizationControllerDelegate
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
          print(authorization,appleIDCredential)
          let userIdentifier = appleIDCredential.user
            let fullName = appleIDCredential.fullName
            let email = appleIDCredential.email
            let realUserStatus = appleIDCredential.realUserStatus
            let identityToken = appleIDCredential.identityToken
            let authCode = appleIDCredential.authorizationCode
        }
    }

func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        //授权错误
    }

这样就实现了apple登录,当第一次授权时,用户需要设置邮箱、用户名。后面再授权时就可以直接指纹验证登录了。

想体验一下可以去App Store下载『懒猪时间盒』,在软件『设置』里面点击『社区』即可

注意:第一次授权会给你返回个人名称等信息,后续授权只会给你返回userIdentifier,也就是user id

二、设备上登录的 Apple ID说明

使用apple登录时,如果设备没有登录apple id的话,系统会自动跳转让用户去登录。

如果有其他特殊情况,比如App通过苹果账号登录后,但是在设备上登录的 Apple ID退出登录或者切换新的账号登录了,这个要怎么处理?

当然这个你可以不用管,比如像QQ登录了之后,QQ切换了手机号,如果不重新授权,那么就不用自动也去切换app内的账号。这个很正常的。

当然如果你想管也可以,apple提供了ASAuthorizationAppleIDProvider这个类,可以通过getCredentialState获取对应userid的登录状态,然后做对应处理。

let appleIDProvider = ASAuthorizationAppleIDProvider()
appleIDProvider.getCredentialState(forUserID: "currentUserIdentifier"){……}

也可以监听通知ASAuthorizationAppleIDProviderCredentialRevokedNotification,当用户状态变更时,会发送这个通知,处理这个通知即可

当前页面是本站的「Baidu MIP」版。查看和发表评论请点击:完整版 »