快速集成苹果授权登陆(Sign in with Apple)
iOS 13后App Store审核指南有所更新
Sign In with Apple will be available for beta testing this summer. It will be required as an option for users in apps that support third-party sign-in when it is commercially available later this year.
当 Sign In with Apple 服务正式上线以后,所有已接入其它第三方登录的 App,Sign In with Apple 将被要求作为一种登录选择,否则有可能就不给过。
App Store审核指南更新
那么如何集成苹果授权登陆呢?
前期工作
需要在苹果后台打开该选项,并且重新生成Profiles配置文件
或者
在Xcode11 Signing & Capabilities中添加Sign In With Apple
证书会自动更新
集成
1.下载NCSignInWithApple
导入文件夹NCSignInWithApple到工程
2.实现下面的代码
[HandleSignInWithAppleModel signInWithAppleWithButtonRect:CGRectMake(30, self.view.bounds.size.height - 180, self.view.bounds.size.width - 60, 100) withSupView:self.view withType:ASAuthorizationAppleIDButtonTypeDefault withStyle:ASAuthorizationAppleIDButtonStyleWhite success:^(ASAuthorization * _Nonnull authorization, NSString * _Nonnull user) {
NSLog(@"授权成功");
} failure:^(NSError * _Nonnull err) {
NSLog(@"授权失败");
}];
具体实现原理
实现流程
1. 添加Sign In with Apple
登录按钮,设置ASAuthorizationAppleIDButton
相关布局,并添加按钮点击响应事件。当然苹果也允许自定义苹果登录按钮的样式,样式要求详见这个文档:Human Interface Guidelines
2. 获取授权码
获取授权码需要在代码中实现两个代理回调ASAuthorizationControllerDelegate、ASAuthorizationControllerPresentationContextProviding分别用于处理授权登录成功和失败、以及提供用于展示授权页面的Window
在授权登录成功回调中,我们可以拿到以下几类数据
-
UserID:
Unique, stable, team-scoped user ID
,苹果用户唯一标识符,该值在同一个开发者账号下的所有App
下是一样的,开发者可以用该唯一标识符与自己后台系统的账号体系绑定起来(这与国内的微信、QQ、微博
等第三方登录流程基本一致) -
Verification data:
Identity token, code
,验证数据,用于传给开发者后台服务器,然后开发者服务器再向苹果的身份验证服务端验证,本次授权登录请求数据的有效性和真实性,详见Sign In with Apple REST API -
Account information:
Name, verified email
,苹果用户信息,包括全名、邮箱等,注意:如果玩家登录时拒绝提供真实的邮箱账号,苹果会生成虚拟的邮箱账号
3. 验证
关于验证的这一步,需要传递授权码给自己的服务端,自己的服务端调用苹果API
去校验授权码Generate and validate tokens。如果验证成功,可以根据userIdentifier
判断账号是否已存在,若存在,则返回自己账号系统的登录态,若不存在,则创建一个新的账号,并返回对应的登录状态给App
附:官方示例代码 Swift 版
附:What the Heck is Sign In with Apple?
附:苹果授权登陆后端验证
附:App Store审核指南的更新
附:Generate and validate tokens
附:NCSignInWithApple