【官网:通过 Apple 登录,让登录变得轻松简朴。】
【iOS 苹果授权登录(Sign in with Apple)系列之原生篇】
前言
2019年苹果推出 苹果登录(Sign in with Apple)方式,要求2020年4月之后APP假如使用第三方或社交登录服务(如 Facebook、谷歌、 Twitter、Linkedln或亚马逊等),必须向用户提供“以苹果账号登录”服务的选项。
假如满足以下条件,则可以不消苹果登录方式:
- 应用专门使用公司自己的帐户设置和登录体系。
- 应用是教导,企业或商业应用,要求用户使用现有的教导或企业帐户登录。
- 应用步调使用政府或行业支持的公民身份辨认体系或电子ID来对用户举行身份验证。
- 应用是特定第三方服务的客户端,要求用户直接登录其邮件,社交媒体或其他第三方帐户才气访问其内容。
官网详细规则
集成流程
一、预备工作
1.最低要求手机iOS体系ios13.0,苹果电脑体系macos(10.15),开辟工具Xcode11
- 登录苹果开辟者账号配景,找到应用的BundleId, 点击进去检察详情信息, 开启 Sign in with Apple 功能。
- Xcode 内里 Signing & Capabilities 添加 Sign in with Apple 功能。
二、代码集成(本流程比力简朴,自界说的按钮,没有服务器验证流程)
由于是自界说的按钮 没有用苹果体系自己的按钮 ASAuthorizationAppleIDButton ,ASAuthorizationAppleIDButton尺寸会有一些限定,还得处理处罚本地化语言。
1.导入头文件,添加署理
#import <AuthenticationServices/AuthenticationServices.h><ASAuthorizationControllerDelegate,ASAuthorizationControllerPresentationContextProviding>2.viewDidLoad 方法中 判断手机体系版本 注册关照
// 手机体系版本 不支持 时 隐蔽苹果登录按钮 if (@available(iOS 13.0, *)) { [[NSNotificationCenter defaultCenter] addObserver:self selectorselector(handleSignInWithAppleStateChanged name:ASAuthorizationAppleIDProviderCredentialRevokedNotification object:nil]; } else { self.appleLoginBtn.hidden = YES; }[self authorizationAppleID];#pragma mark- 授权苹果ID- (void)authorizationAppleID{ if (@available(iOS 13.0, *)) { // 基于用户的Apple ID授权用户,天生用户授权哀求的一种机制 ASAuthorizationAppleIDProvider * appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init]; // 创建新的AppleID 授权哀求 ASAuthorizationAppleIDRequest * authAppleIDRequest = [appleIDProvider createRequest]; // 在用户授权期间哀求的接洽信息// authAppleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail]; //假如 KeyChain 内里也有登录信息的话,可以直接使用内里生存的用户名和暗码举行登录。// ASAuthorizationPasswordRequest * passwordRequest = [[[ASAuthorizationPasswordProvider alloc] init] createRequest]; NSMutableArray <ASAuthorizationRequest *> * array = [NSMutableArray arrayWithCapacity:2]; if (authAppleIDRequest) { [array addObject:authAppleIDRequest]; }// if (passwordRequest) {// [array addObject:passwordRequest];// } NSArray <ASAuthorizationRequest *> * requests = [array copy]; // 由ASAuthorizationAppleIDProvider创建的授权哀求 管理授权哀求的控制器 ASAuthorizationController * authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:requests]; // 设置授权控制器关照授权哀求的成功与失败的署理 authorizationController.delegate = self; // 设置提供 展示上下文的署理,在这个上下文中 体系可以展示授权界面给用户 authorizationController.presentationContextProvider = self; // 在控制器初始化期间启动授权流 [authorizationController performRequests]; }}
- 实今世理方法 授权成功 获取 用户的唯一标识 传给配景 判断该用户是否绑定手机号,假如绑定了直接登录,假如没绑定跳绑定手机号页面
#pragma mark- ASAuthorizationControllerDelegate// 授权成功- (void)authorizationControllerASAuthorizationController *)controller didCompleteWithAuthorizationASAuthorization *)authorization API_AVAILABLE(ios(13.0)) { if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) { ASAuthorizationAppleIDCredential * credential = (ASAuthorizationAppleIDCredential *)authorization.credential; // 苹果用户唯一标识符,该值在同一个开辟者账号下的全部 App 下是一样的,开辟者可以用该唯一标识符与自己配景体系的账号体系绑定起来。 NSString * userID = credential.user; //把用户的唯一标识 传给配景 判断该用户是否绑定手机号,假如绑定了直接登录,假如没绑定跳绑定手机号页面// // 苹果用户信息 假如授权过,大概无法再次获取该信息// NSPersonNameComponents * fullName = credential.fullName;// NSString * email = credential.email;//// // 服务器验证须要使用的参数// NSString * authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding];// NSString * identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding];//// // 用于判断当前登录的苹果账号是否是一个真实用户,取值有:unsupported、unknown、likelyReal// ASUserDetectionStatus realUserStatus = credential.realUserStatus;// NSLog(@"userID: %@", userID);// NSLog(@"fullName: %@", fullName);// NSLog(@"email: %@", email);// NSLog(@"authorizationCode: %@", authorizationCode);// NSLog(@"identityToken: %@", identityToken);// NSLog(@"realUserStatus: %@", @(realUserStatus)); }else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) { // 这个获取的是iCloud记录的账号暗码,须要输入框支持iOS 12 记录账号暗码的新特性,假如不支持,可以忽略 // 用户登录使用现有的暗码根据 ASPasswordCredential * passwordCredential = (ASPasswordCredential *)authorization.credential; // 暗码根据对象的用户标识 用户的唯一标识 NSString * user = passwordCredential.user; //把用户的唯一标识 传给配景 判断该用户是否绑定手机号,假如绑定了直接登录,假如没绑定跳绑定手机号页面// // 暗码根据对象的暗码// NSString * password = passwordCredential.password;// NSLog(@"userID: %@", user);// NSLog(@"password: %@", password); } else { }}// 授权失败- (void)authorizationControllerASAuthorizationController *)controller didCompleteWithErrorNSError *)error API_AVAILABLE(ios(13.0)) { NSString *errorMsg = nil; switch (error.code) { case ASAuthorizationErrorCanceled: errorMsg = @"用户取消了授权哀求"; break; case ASAuthorizationErrorFailed: errorMsg = @"授权哀求失败"; break; case ASAuthorizationErrorInvalidResponse: errorMsg = @"授权哀求相应无效"; break; case ASAuthorizationErrorNotHandled: errorMsg = @"未能处理处罚授权哀求"; break; case ASAuthorizationErrorUnknown: errorMsg = @"授权哀求失败未知缘故起因"; break; } NSLog(@"%@", errorMsg);}#pragma mark- ASAuthorizationControllerPresentationContextProviding- (ASPresentationAnchor)presentationAnchorForAuthorizationControllerASAuthorizationController *)controller API_AVAILABLE(ios(13.0)){ return self.view.window;}#pragma mark- apple授权状态 更改关照- (void)handleSignInWithAppleStateChangedNSNotification *)notification{ NSLog(@"%@", notification.userInfo);}- (void)dealloc { if (@available(iOS 13.0, *)) { [[NSNotificationCenter defaultCenter] removeObserver:self name:ASAuthorizationAppleIDProviderCredentialRevokedNotification object:nil]; }}注意事项
1、初次登录会返回全部参数,包罗全名、邮箱等(假如玩家登录时拒绝提供真实的邮箱账号,苹果会天生捏造的邮箱账号),二次登录只会返回 UserID 和 授权码,别的信息不再返回!
2、同一个开辟者账号下全部APP,同一个apple id登岸时,获取的UserID 是一样的。
3、两个开辟者账号下的应用,同一个apple id登岸时,获取的 UserID 不一样
4、NSNotification.Name.ASAuthorizationAppleIDProviderCredentialRevoked, 体系在苹果账号登出时关照,此时应用假如是苹果登岸的用户,有没有须要也登出账号?
5、假如打开登录界面时,装备的 iCloud Keychain 有 apple id 账号可用时,可以弹窗让用户选择 iCloud Keychain 里的账号来举行登岸。
|