iOS ~ Apple ID 登录APP

源代码 2024-9-22 08:25:00 120 0 来自 中国
【官网:通过 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尺寸会有一些限定,还得处理处罚本地化语言。
3.png 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 里的账号来举行登岸。
4.png
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-24 16:12, Processed in 0.177307 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表