AppleIDManager.m 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. //
  2. // AppleIDManager.m
  3. // SignInWithAppleDemo
  4. //
  5. // Created by bogokj on 2020/6/19.
  6. // Copyright © 2020 fandong. All rights reserved.
  7. //
  8. #import "AppleIDManager.h"
  9. @interface AppleIDManager ()<ASAuthorizationControllerDelegate,ASAuthorizationControllerPresentationContextProviding>
  10. @end
  11. @implementation AppleIDManager
  12. + (AppleIDManager *)defaultManager{
  13. static AppleIDManager *defaultManager = nil;
  14. static dispatch_once_t predicate;
  15. dispatch_once(&predicate, ^{
  16. defaultManager = [[self alloc] init];
  17. });
  18. return defaultManager;
  19. }
  20. - (void)loginBtnAction:(ASAuthorizationAppleIDButton *)sender API_AVAILABLE(ios(13.0)){
  21. if (@available(iOS 13.0, *)) {
  22. ASAuthorizationAppleIDProvider *provider = [[ASAuthorizationAppleIDProvider alloc] init];
  23. ASAuthorizationAppleIDRequest *request = [provider createRequest];
  24. request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
  25. ASAuthorizationController *authC = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
  26. authC.delegate = self;
  27. authC.presentationContextProvider = self;
  28. [authC performRequests];
  29. }
  30. }
  31. -(void)loginAction{
  32. if (@available(iOS 13.0, *)) {
  33. ASAuthorizationAppleIDProvider *provider = [[ASAuthorizationAppleIDProvider alloc] init];
  34. ASAuthorizationAppleIDRequest *request = [provider createRequest];
  35. request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
  36. ASAuthorizationController *authC = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
  37. authC.delegate = self;
  38. authC.presentationContextProvider = self;
  39. [authC performRequests];
  40. }
  41. }
  42. #pragma mark - ASAuthorizationControllerDelegate
  43. - (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)){
  44. if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
  45. ASAuthorizationAppleIDCredential *credential = authorization.credential;
  46. NSString *state = credential.state;
  47. NSString *user = credential.user;
  48. NSPersonNameComponents *fullName = credential.fullName;
  49. NSString *email = credential.email;
  50. NSString *authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding];
  51. NSString *identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding];
  52. ASUserDetectionStatus realUserStatus = credential.realUserStatus;
  53. // state:(null)
  54. // user:001872.a22fc8cc2d0a4d0bacaf109007e19351.0650
  55. // fullName:<NSPersonNameComponents: 0x283e109a0> {givenName = 晨光, familyName = 宋, middleName = (null), namePrefix = (null), nameSuffix = (null), nickname = (null) phoneticRepresentation = (null) }
  56. // email:qjhnjd6nfq@privaterelay.appleid.com
  57. // authorizationCode:c7a061f7c639a4a079b7005969f17d853.0.rryxs.9P6Uup8Lxr6mMFO169OnlA
  58. // identityToken:eyJraWQiOiJlWGF1bm1MIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY29tLmJ1Z3VsaXZlU2hvcC5jb20iLCJleHAiOjE2NDE1MzgyMjIsImlhdCI6MTY0MTQ1MTgyMiwic3ViIjoiMDAxODcyLmEyMmZjOGNjMmQwYTRkMGJhY2FmMTA5MDA3ZTE5MzUxLjA2NTAiLCJjX2hhc2giOiJLUVhONUFIczVtVlNVU1ZVWlE3LV9BIiwiZW1haWwiOiJxamhuamQ2bmZxQHByaXZhdGVyZWxheS5hcHBsZWlkLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjoidHJ1ZSIsImlzX3ByaXZhdGVfZW1haWwiOiJ0cnVlIiwiYXV0aF90aW1lIjoxNjQxNDUxODIyLCJub25jZV9zdXBwb3J0ZWQiOnRydWUsInJlYWxfdXNlcl9zdGF0dXMiOjJ9.20XmZONFE4nsfvd5Q4HSuBqbezRuGxiZ-eRGlw-l5gbuNjlLP_iHuZsVo8tf6JqLzYRA_j7pkliTslyvhURZiul8yWI7DsGYXsl85EMWFsIeKj780O9HnOuI4pWM66VJu0-EWwasGaD_4JsxGp74h89EWm0X9M-x9n8g-gEuD1k8jO5bq9IPEMBLdkMJgfp8H8vBbUnEl5BGWUsd5-fK6sXcSCq4NQLwAhsQqSWFVKGDtIsEUy1898cbBvr1AHmh5n9M9jGPr4zkv7z7hyaS8chHOdB93w2EkskqwLb95rxHax92JQHOrpYHqD1-cw5_zLmjU_QAcN1EYsR4JzzMtQ
  59. // realUserStatus:2
  60. NSLog(@"授权成功\nstate:%@\nuser:%@\nfullName:%@\nemail:%@\nauthorizationCode:%@\nidentityToken:%@\nrealUserStatus:%ld", state,user,fullName,email,authorizationCode,identityToken,realUserStatus);
  61. if (self.successBlock) {
  62. self.successBlock(authorizationCode, identityToken, user);
  63. }
  64. }else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]){
  65. // 用户登录使用的是: 现有密码凭证
  66. ASPasswordCredential *credential = (ASPasswordCredential *)authorization.credential;
  67. NSString *user = credential.user; // 密码凭证对象的用户标识(用户的唯一标识)
  68. NSString *password = credential.password;
  69. NSLog(@"Apple登录_现有密码凭证: %@, %@", user, password);
  70. }else{
  71. }
  72. }
  73. - (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)){
  74. NSString *errorMsg = @"";
  75. switch (error.code) {
  76. case ASAuthorizationErrorCanceled:
  77. errorMsg = NSLocalizedString(@"用户取消了授权请求",nil);
  78. break;
  79. case ASAuthorizationErrorFailed:
  80. errorMsg = NSLocalizedString(@"授权请求失败",nil);
  81. break;
  82. case ASAuthorizationErrorInvalidResponse:
  83. errorMsg = NSLocalizedString(@"授权请求响应无效",nil);
  84. break;
  85. case ASAuthorizationErrorNotHandled:
  86. errorMsg = NSLocalizedString(@"未能处理授权请求",nil);
  87. break;
  88. case ASAuthorizationErrorUnknown:
  89. errorMsg = @"";
  90. // errorMsg = NSLocalizedString(@"授权请求失败未知原因",nil);
  91. break;
  92. default:
  93. break;
  94. }
  95. NSLog(@"授权失败:errorMsg:%@",errorMsg.length ? errorMsg : error.localizedDescription);
  96. if (self.failureBlock) {
  97. self.failureBlock(errorMsg.length ? errorMsg : error.localizedDescription);
  98. }
  99. }
  100. #pragma mark - ASAuthorizationControllerPresentationContextProviding
  101. - (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller API_AVAILABLE(ios(13.0)){
  102. return self.window;
  103. }
  104. - (ASAuthorizationAppleIDButton *)loginBtn API_AVAILABLE(ios(13.0)){
  105. if (!_loginBtn) {
  106. if (@available(iOS 13.2, *)) {
  107. _loginBtn = [ASAuthorizationAppleIDButton buttonWithType:ASAuthorizationAppleIDButtonTypeSignUp style:ASAuthorizationAppleIDButtonStyleBlack];
  108. } else {
  109. // Fallback on earlier versions
  110. }
  111. // [_loginBtn addTarget:self action:@selector(loginBtnAction:) forControlEvents:UIControlEventTouchDown];
  112. }
  113. return _loginBtn;
  114. }
  115. @end