美文网首页
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