在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用户的信息,包含了以下信息
- User ID: 苹果用户唯一标识符,该值在同一个开发者账号下的所有 App 下是一样的,开发者可以用该唯一标识符与自己后台系统的账号体系绑定起来。
- Verification data: Identity token, code,验证数据,用于传给开发者后台服务器,然后开发者服务器再向苹果的身份验证服务端验证本次授权登录请求数据的有效性和真实性,这个是为了安全考虑。如果只是自己标记用户,可以省略这一步。
- Account information: Name, verified email,苹果用户信息,包括全名、邮箱等。
- Real user indicator: 用于判断当前登录的苹果账号是否是一个真实用户,取值有:unsupported、unknown、likelyReal。这个判断并不准确,并且苹果自己也提到如果长时间没有判断出来会返回unknown
//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
,当用户状态变更时,会发送这个通知,处理这个通知即可
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/1030.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!