美文网首页
iOS集成苹果登录

iOS集成苹果登录

作者: 最强的小强 | 来源:发表于2021-06-09 15:11 被阅读0次

    前言:本文使用的是MOB的ShareSDK进行的苹果登录(iOS13以上才可以使用)

    下面是核心的业务逻辑处理 (首先根据uid去登录,查询到未注册就前去注册,注册成功后绑定手机号,然后登录即可)
    1.获取苹果授权,使用苹果uid来进行登录,获取token进入主页面
    
    - (void)didClickedIphoneInThirdPartyCell:(WEThirdPartyLoginCell *)cell {
        [WEHUD showWaitHUD];
        @weakify(self)
        [[WELoginManager sharedInstance] appleLoginSuccessed:^{
            [WEHUD hideHUD];
            AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
            appDelegate.rootView = [[WERootViewController alloc]init];
            WERootViewController *rootC = appDelegate.rootView;
            rootC.selectedIndex = 0;
            [rootC setChildrenRefresh:YES];
            [weak_self reloadLoginBtnEnabled];
            [UIApplication sharedApplication].delegate.window.rootViewController = rootC;
        } failed:^(NSError * _Nullable error, NSDictionary * _Nullable info) {
            [WEHUD hideHUD];
            if (error.code == 10112) {
                WEBindTelePhoneVC *phoneC = [[WEBindTelePhoneVC alloc]init];
                phoneC.delegate = self;
                phoneC.info = info;
                phoneC.type = 3; // 苹果登录
                [self.navigationController pushViewController:phoneC animated:YES];
            } else {
                UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"苹果登录失败" message:@"请稍候重试" preferredStyle:UIAlertControllerStyleAlert];
                UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
                [alertController addAction:sureAction];
                [weak_self presentViewController:alertController animated:YES completion:nil];
            }
        }];
    }
    // 苹果登录
    - (void)appleLoginSuccessed:(LoginSuccessed)successed failed:(LoginFailed)failed {
        [ShareSDK authorize:SSDKPlatformTypeAppleAccount settings:nil onStateChanged:^(SSDKResponseState state, SSDKUser *user, NSError *error) {
            if (state == SSDKResponseStateSuccess) {
                NSString *userID = @"";
                if (user.credential) {
                    SSDKCredential *credential = user.credential;
                    if (credential.rawData) {
                        NSDictionary *authUser = credential.rawData;
                        if ([authUser isKindOfClass:[NSDictionary class]]) {
                            if ([authUser objectForKey:@"user"]) {
                                userID = authUser[@"user"];
                            }
                        }
                    }
                }
                NSString *resultStr = [RSA encryptString:userID publicKey:RSAPublicKey];
                if ([resultStr isEqualToString:@""]) {
                    NSError *error = nil;
                    failed(error,nil);
                    return;
                }
                NSDictionary *info = @{@"uid":resultStr
                                       };
                [WEHUD showWaitHUD];
                AFHTTPSessionManager *manage = [AFHTTPSessionManager manager];
                [manage.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
                manage.requestSerializer = [AFHTTPRequestSerializer serializer];
                manage.responseSerializer = [AFHTTPResponseSerializer serializer];
                manage.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/javascript",@"text/plain", nil];
                NSString *url = [NSString stringWithFormat:@"%@app/login/third-party/apple/login",HostUrl];
                [manage POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
                    [formData appendPartWithFormData:info.jsonStringEncoded.dataValue name:@"info"];
                } progress:^(NSProgress * _Nonnull uploadProgress) {
                    
                } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                    NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
                    [WEHUD hideHUD];
                    BOOL isBinded = [responseDic[@"data"][@"success"] boolValue];
                    if (isBinded) {
                        [WELoginManager sharedInstance].accessToken = responseDic[@"data"][@"data"];
                        [self verifyUserInfoSuccessed:successed failed:failed];
                    } else {
                        NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:10112 userInfo:nil];
                        if (failed) {
                            failed(error,info);
                        }
                    }
                } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                    [WEHUD hideHUD];
                    if (failed) {
                        failed(error, info);
                    }
                }];
            } else if (state == SSDKResponseStateCancel) {
                [WEHUD showWarningHUD:@"苹果登录已取消"];
            } else if (state == SSDKResponseStateFail)  {
                [WEHUD showWarningHUD:@"苹果登录失败"];
                if (failed) {
                    failed(error,nil);
                }
            } else {
                NSError *error = nil;
                failed(error,nil);
            }
        }];
    }
    
    2.如果登录失败,就说明后台没有该用户的苹果登录记录,需要进行苹果注册
    3.苹果注册,然后进行绑定手机号,绑定用户(下次进行苹果登录的时候就不需要这些了,直接进行登录就可以获取token进入主页面了)
    // 苹果登录注册
    - (void)registerWithIphone {
        [WEHUD showWaitHUD];
        AFHTTPSessionManager *manage = [AFHTTPSessionManager manager];
        [manage.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
        manage.requestSerializer = [AFHTTPRequestSerializer serializer];
        manage.responseSerializer = [AFHTTPResponseSerializer serializer];
        manage.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/javascript",@"text/plain", nil];
        NSString *url = [NSString stringWithFormat:@"%@app/login/apple/user",HostUrl];
    
        [manage POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
            [formData appendPartWithFormData:self.telephone.dataValue name:@"mobile"];
            [formData appendPartWithFormData:self.info.jsonStringEncoded.dataValue name:@"info"];
            [formData appendPartWithFormData:self.codeView.code.dataValue name:@"code"];
        } progress:^(NSProgress * _Nonnull uploadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
            if ([responseDic[@"httpCode"] integerValue] == 200) {
                if (![responseDic[@"data"][@"success"] boolValue]) {
                    if (![responseDic[@"data"][@"data"] isKindOfClass:NSNull.class]) {
                        @try {
                            NSInteger code = [responseDic[@"data"][@"data"] integerValue];
                            if (code == 1) {
                                [WEHUD showWarningHUD:@"验证码错误,请重新输入"];
                            } else {
                                [WELoginManager sharedInstance].phoneNum = self.telephone;
                                [self getIphoneToken];
                            }
                        } @catch (NSException *exception) {
                            
                        } @finally {
                            
                        }
                    } else {
                        [WEHUD showWarningHUD:@"注册失败"];
                    }
                   
                } else {
                    [WELoginManager sharedInstance].phoneNum = self.telephone;
                    [self getIphoneToken];
                }
            } else {
                [WEHUD showWarningHUD:@"网络错误"];
            }
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            [WEHUD showWarningHUD:@"网络错误"];
        }];
    }
    
    4.绑定成功,直接后台返回token进行登录,如果没有返回,自己再拿苹果uid,直接进行默认苹果登录即可
    // 获取苹果登录token
    - (void)getIphoneToken {
        AFHTTPSessionManager *manage = [AFHTTPSessionManager manager];
        [manage.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
        manage.requestSerializer = [AFHTTPRequestSerializer serializer];
        manage.responseSerializer = [AFHTTPResponseSerializer serializer];
        manage.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/javascript",@"text/plain", nil];
        NSString *url = [NSString stringWithFormat:@"%@app/login/third-party/apple/login",HostUrl];
        
        [manage POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
            [formData appendPartWithFormData:self.info.jsonStringEncoded.dataValue name:@"info"];
        } progress:^(NSProgress * _Nonnull uploadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            [WEHUD hideHUD];
            NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
            if ([responseDic[@"httpCode"] integerValue] == 200) {
                if (![responseDic[@"data"][@"success"] boolValue]) {
                    [WEHUD showWarningHUD:@"该帐号已存在,请更换手机号,或者选择登录"];
                } else {
                    [WELoginManager sharedInstance].accessToken = responseDic[@"data"][@"data"];
                    if (self.delegate && [self.delegate respondsToSelector:@selector(thirdPartyLoginWithCodeType:)]) {
                        [self.delegate thirdPartyLoginWithCodeType:self.type];
                    }
                }
            } else {
                [WEHUD showWarningHUD:@"网络错误"];
            }
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            [WEHUD showWarningHUD:@"网络错误"];
        }];
    }
    

    相关文章

      网友评论

          本文标题:iOS集成苹果登录

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