美文网首页
iOS Sign In With AppleID 苹果登录工具类

iOS Sign In With AppleID 苹果登录工具类

作者: 15218502b6fe | 来源:发表于2021-09-10 08:32 被阅读0次

工具类:

.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];
            }
        }];
    }
}

相关文章

网友评论

      本文标题:iOS Sign In With AppleID 苹果登录工具类

      本文链接:https://www.haomeiwen.com/subject/hafwwltx.html