- 原文博客地址: Sign In With Apple
- 在之前的文章iOS13适配深色模式(Dark Mode)中只是简单提到了关于Sign In With Apple的问题, 下面就着重介绍一下什么是
Apple
登录 - 对于很多应用都会有自己的账号登录体系, 但是一般都相对繁琐, 或者用户会忘记密码等, 为此一般都会接入微信、
QQ
登录, 国外应用也会有Google
、Facebook
等第三方登录方式 - 在
WWDC 2019
上, 苹果要求使用第三方登录的应用也必须接入苹果账号登录(2020年必须适配) - 当然了如果你的
App
没有提供第三方登录,那就不用集成; 如果用到了第三方登录,那么需要提供Sign in with Apple
Sign in with Apple
Sign in with Apple makes it easy for users to sign in to your apps and websites using their Apple ID. Instead of filling out forms, verifying email addresses, and choosing new passwords, they can use Sign in with Apple to set up an account and start using your app right away. All accounts are protected with two-factor authentication for superior security, and Apple will not track users’ activity in your app or website.
Make signing in easy
Sign In with Apple
为用户提供一种快速安全的登录方式, 用户可以轻松登录开发者的应用和网站- 使用
Apple
登录可以让用户在系统中设置用户帐户,开发者可以获取到用户名称(Name
), 用户唯一标识符(ID
)以及经过验证的电子邮件地址(email
) Sign In with Apple
相关特性- 尊重用户隐私: 开发人员仅仅只能获取到用户的姓名和邮箱, 苹果也不会收集用户和应用交互的任何信息
- 系统内置的安全性:
2F
双重验证(Face ID
或Touch ID
),从此登录不再需要密码 - 简化账号的创建和登录流程,无缝跨设备使用
- 开发者可以获取到已验证过的邮箱作为登录账号或者与用户进行通信(注:用户可以选择隐藏真实邮箱,并使用苹果提供的虚拟邮箱进行授权)
- 可跨平台使用, Apple登录支持
iOS
,macOS
,tvOS
和watchOS
以及JavaScript
- 更多信息可惨考
使用Apple登录
在代码集成之前还需要做一些准备工作
- 在开发者网站,在需要添加
Sign in with Apple
功能
- 在
Xcode
里面开启Sign in with Apple
功能
登录按钮
Apple
苹果登录按钮, 需要使用ASAuthorizationAppleIDButton
类创建添加, 该类是iOS 13
苹果提供的创建Apple
登录按钮的专属类
1 | 13.0, *) (iOS |
开始创建Apple
登录按钮
1 | // apple登录按钮 |
ASAuthorizationAppleIDButton
的初始化方法中有两个参数type
和style
type
是设置按钮的类型ASAuthorizationAppleIDButton.ButtonType
style
设置按钮的样式ASAuthorizationAppleIDButton.Style
- 可参考官网介绍Sign In with Apple
ButtonType
1 | public enum ButtonType : Int { |
不同ButtonType
展示效果如下
Style
1 | 13.0, *) (iOS |
不同Style
展示效果和使用场景如下
cornerRadius
设置按钮的圆角大小
1 | // 默认值大概5左右, 具体值不知 |
发起授权请求
在创建好登录按钮后, 点击按钮的操作就是, 根据用户登录的AppleID
发起授权请求, 并获得授权码
iOS 13
系统给我们提供了一个ASAuthorizationAppleIDProvider
类- 该类就是一种基于用户的
AppleID
生成用户的授权请求的一种机制 - 在发起授权请求之前, 需要配置要获取的数据权限范围(例如:用户名、邮箱等)
- 为获取授权结果, 还需要设置回调代理, 并发起授权请求
1 | fileprivate func appleAction() { |
delegate
设置授权控制器通知授权请求的成功与失败的代理
1 | // 代理 |
presentationContextProvider
需要向用户展示授权页面时, 需要遵循该协议
1 | // 显示上下文的代理, 系统可以在上下文中向用户展示授权页面 |
ASAuthorization
- 在控制器获得授权的成功回调中, 协议方法提供了一个
ASAuthorization
ASAuthorization
是对控制器成功授权的封装, 包括两个属性
1 | 13.0, *) (iOS |
ASAuthorizationCredential
是一个协议, 在处理授权成功的结果中, 需要使用遵循该协议的类, 有以下三个
ASPasswordCredential
: 密码凭证ASAuthorizationAppleIDCredential
: Apple ID身份验证成功产生的凭证ASAuthorizationSingleSignOnCredential
: 单点登录(SSO)身份验证产生的凭据
ASPasswordCredential
1 | 12.0, *) (iOS |
ASAuthorizationAppleIDCredential
1 | 13.0, *) (iOS |
ASAuthorizationSingleSignOnCredential
1 | 13.0, *) (iOS |
授权成功
上面有提到, 在ASAuthorizationControllerDelegate
有两个协议方法, 分别是授权成功和失败的回调, 下面就具体看看
1 | extension SignViewController: ASAuthorizationControllerDelegate { |
做好了上面配置, 就可以看到下面的登录页面
- 如果不修改姓名, 授权成功后将获取到用户的姓名
- 如果选择共享我的电子邮件, 授权成功将获取到用户的电子邮件地址
- 如果选择隐藏邮件地址, 授权成功将获取到一个虚拟的电子邮件地址
- 点击姓名右侧的清除按钮可以修改用户名, 如下页面
- 如果登录用户修改了用户名, 那么授权成功后获取到的用户名就是修改后的
- 使用过
AppleID
登录过App
,进入应用的时候会提示使用TouchID
登录的场景如下
- 如果使用指纹登录三次失败后, 下面会有一个使用密码继续的按钮, 可以使用手机密码继续登录
- 如果手机没有设置
Apple ID
, 使用苹果登录, 将会有弹窗提示,
监听授权状态
在特殊情况下我们还需要监听授权状态的改变, 并进行相应的处理
- 用户终止在该
App
中使用Sign in with Apple
功能 - 用户在设置里注销了
Apple ID
- 针对类似这种情况,
App
需要获取到这些状态,然后做退出登录操作 - 我们需要在
App
启动的时候,来获取当前用户的授权状态
1 | // ASAuthorizationAppleIDProvider提供了一个获取用户授权状态和授权凭据是否有效 |
示例代码如下
1 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { |
除此之外还可以通过通知方法来监听revoked
状态, 在ASAuthorizationAppleIDProvider
中增加了一个属性, 用于监听revoked
状态
1 | 13.0, *) (iOS |
参考文档
Sign In with Apple
涉及到的相关资料文档如下