iOS集成苹果登录

2021-06-09  本文已影响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:@"网络错误"];
    }];
}
上一篇下一篇

猜你喜欢

热点阅读