一、为什么要使用Sign in with Apple?
苹果在19年 9 月12 号更新了审核指南,加入 4.8 Sign in with Apple 一条,要求所有使用第三方登录 的 App,都必须接入 Sign in with Apple。已经上架的 App 需在 2020 年 4 月 前完成接入工作,新上架 App(如果支持三方登录)必须接入Sign in with Apple,否则将被拒。
二、如何接入Sign In With Apple ?
1、前期准备
(1)、系统配置:苹果开发文档明确规定:苹果电脑系统macos(10.15)(吓的我赶紧升级我的笔记本系统),手机iOS系统ios(13.0)(毫不犹豫的升级)。由于只有Xcode11才支持Sign In With Apple接入代码的开发,所以Xcode我升级到了11.1正式版。
(2)、证书配置
登录开发者中心,在需要启用 Sign in with Apple 的 Apple ID中勾选 Sign in with Apple.
具体步骤如下图
登录苹果开发者中心,选择Account
选择 Identifiers 这边可以看到自己工程的 Bundle Identifier点进去勾选 Sign in with Apple 若没有添加一个
注意:
描述信息最好使用 XC + Bundle ID
勾选 Sign in with Apple
(3)、工程配置
新建工程,选择项目 TARGETS -> Signing&Capabilities ,单击下图中的 3:Capability:
在弹出框中搜索找到 Sign in with Apple:双击添加
这些完成后,我们就可以在项目中添加代码了。
2、添加代码
(1)、在需要使用 login with Apple 的地方,引入头文件:
#import <AuthenticationServices/AuthenticationServices.h>
首先,我们需要一个登录按钮,系统为我们预设了一个固定样式登录按钮ASAuthorizationAppleIDButton,我们可以直接使用。
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDButton *appleIDButton = [ASAuthorizationAppleIDButton new];
appleIDButton.frame = CGRectMake(.0, .0, CGRectGetWidth(self.view.frame) - 40.0, 100.0);
CGPoint origin = CGPointMake(20.0, CGRectGetMidY(self.view.frame));
CGRect frame = appleIDButton.frame;
frame.origin = origin;
appleIDButton.frame = frame;
appleIDButton.cornerRadius = CGRectGetHeight(appleIDButton.frame) * 0.25;
[self.view addSubview:appleIDButton];
[appleIDButton addTarget:self action:@selector(handleAuthrization:) forControlEvents:UIControlEventTouchUpInside];
}
通过参数 type、style可以设置为不同样式的按钮;当然,我们也可以自定义,但是要遵循苹果的相关设计规范,详见 Human Interface Guidelines
(2)、我们还需要用到两个协议
// 提供关于授权请求结果信息的接口
ASAuthorizationControllerDelegate,
// 控制器的代理找一个展示授权控制器的上下文的接口
ASAuthorizationControllerPresentationContextProviding>
协议的方法
#pragma mark - ASAuthorizationControllerDelegate
// 授权成功地回调
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0));
// 授权失败的回调
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0));
#pragma mark - ASAuthorizationControllerPresentationContextProviding
/*! @brief 返回弹出请求视图的window
*
* @param ASPresentationAnchor 为 UIWindow 的别名
* @param controller 管理授权请求的控制器
* return 弹出请求视图的window
*/
- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller API_AVAILABLE(ios(13.0))