工具类:
.h
#import <Foundation/Foundation.h>
typedefvoid(^ResultBlock)(Booleanresult,NSString*resultMsg,NSString*user,NSString*token,NSString*authorizationCode);
API_AVAILABLE(ios(13.0))
@interface SignInAppleID : NSObject
+ (instancetype)shared;
- (void)signInBlock:(ResultBlock)block;
@end
.m
#import "SignInAppleID.h"
@interface SignInAppleID()<ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding>
@property (nonatomic, copy) ResultBlock resultBlock;
@end
@implementation SignInAppleID
+ (instancetype)shared {
staticSignInAppleID*instance =nil;
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
instance = [SignInAppleIDnew];
});
returninstance;
}
- (void)signInBlock:(ResultBlock)blockAPI_AVAILABLE(ios(13.0)){
self.resultBlock= block;
ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
ASAuthorizationAppleIDRequest*request = appleIDProvider.createRequest;
request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
ASAuthorizationController *vc = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
vc.delegate=self;
vc.presentationContextProvider = self;
[vcperformRequests];
}
#pragma mark- Delegate ASAuthorizationControllerPresentationContextProviding
- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController*)controllerAPI_AVAILABLE(ios(13.0)) {
return [UIApplication sharedApplication].keyWindow;
}
#pragma mark- Delegate ASAuthorizationControllerDelegate
//授权成功的回调
- (void)authorizationController:(ASAuthorizationController*)controller didCompleteWithAuthorization:(ASAuthorization*)authorizationAPI_AVAILABLE(ios(13.0)) {
if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
ASAuthorizationAppleIDCredential *credential = (ASAuthorizationAppleIDCredential *)authorization.credential;
NSString*state = credential.state;
NSString*userID = credential.user;
NSPersonNameComponents*fullName = credential.fullName;
NSString*email = credential.email;
NSString*authorizationCode = [[NSStringalloc]initWithData:credential.authorizationCodeencoding:NSUTF8StringEncoding];// refresh token
NSString*identityToken = [[NSStringalloc]initWithData:credential.identityTokenencoding:NSUTF8StringEncoding];// access token
ASUserDetectionStatusrealUserStatus = credential.realUserStatus;
NSLog(@"授权完成:::%@", authorization.credential);
NSLog(@"state: %@", state);
NSLog(@"userID: %@", userID);
NSLog(@"fullName: %@", fullName);
NSLog(@"email: %@", email);
NSLog(@"authorizationCode: %@", authorizationCode);
NSLog(@"identityToken: %@", identityToken);
NSLog(@"realUserStatus: %@",@(realUserStatus));
self.resultBlock(YES,@"授权成功", userID, identityToken, authorizationCode);
// 拿到对应数据后, 跟自己的服务器后台进行交互, 把数据传给后台进行登录验证
}
}
//授权失败的回调
- (void)authorizationController:(ASAuthorizationController*)controller didCompleteWithError:(NSError*)errorAPI_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);
self.resultBlock(NO, errorMsg,nil,nil,nil);
}
@end
工具类调用:
//苹果登陆按钮
if(@available(iOS13.0, *)) {
ASAuthorizationAppleIDButton *appleBtn = [[ASAuthorizationAppleIDButton alloc] initWithAuthorizationButtonType:ASAuthorizationAppleIDButtonTypeContinue authorizationButtonStyle:ASAuthorizationAppleIDButtonStyleWhiteOutline];
appleBtn.bounds=CGRectMake(0,0,44,44);
appleBtn.cornerRadius=22.0f;
[self.mainView addSubview:appleBtn];
[appleBtnmas_makeConstraints:^(MASConstraintMaker*make) {
make.centerX.mas_equalTo(self.mainView1).mas_offset(35);
make.top.mas_equalTo(self.weChatBtn.mas_top);
make.width.height.mas_equalTo(44);
}];
[appleBtnaddTarget:self action:@selector(signInWithApple) forControlEvents:UIControlEventTouchUpInside];
}
- (void)signInWithApple {
if(@available(iOS13.0, *)) {
[[SignInAppleIDshared]signInBlock:^(Booleanresult,NSString*resultMsg,NSString*user,NSString*token,NSString*authorizationCode) {
if(result) {
//服务器交互
//...
}else{
[self.viewmakeCenterToast:resultMsg];
}
}];
}
}
网友评论