版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2017.05.27 |
前言
??很多時(shí)候,我們app的個(gè)人中心這個(gè)模塊都需要綁定QQ,微信和微博等第三方平臺(tái)的需求,我們以前的項(xiàng)目也有這方面的需求,正好我也負(fù)責(zé)這一塊,下面我就詳細(xì)的和大家說(shuō)一個(gè)這塊的實(shí)現(xiàn)方法。
詳情
一、需求展示
首先我們先看一下需求,如下圖所示:
第三方平臺(tái)綁定需求
??我這里都綁定好了,所以這里都顯示的是已綁定,正常的需求是如果沒(méi)有綁定,這里就顯示未綁定,大家湊合著看吧,知道意思即可。
二、技術(shù)方案
我這里可以想到的是兩種方案:
- 集成QQ等需要綁定的QQ,微信等SDK,根據(jù)接口發(fā)送請(qǐng)求獲取openid,location,nickname等參數(shù),然后在給自己的服務(wù)器發(fā)送請(qǐng)求,實(shí)現(xiàn)綁定。
- 利用第三方SDK,比如shareSDK直接可以獲取接口數(shù)據(jù)信息,然后給請(qǐng)求自己的服務(wù)器綁定。
我這里采取的是第二種方法,下面我分析下優(yōu)缺點(diǎn):
- 優(yōu)點(diǎn):與登錄模塊使用相同的shareSDK,這里同樣用這個(gè)就減小了包的大小,同時(shí)減少了分著平臺(tái)集成的工作量,減少時(shí)間成本。
- 缺點(diǎn):如果是分著集成,可以很自由的功能定制,使用第三方ShareSDK受限于接口規(guī)則,不能自由定制,自由度相對(duì)小,但是這里采用第二種方案已足夠,可以了。
三、方案實(shí)現(xiàn)
??下面我就給出主要的代碼實(shí)現(xiàn),至于具體的ShareSDK的集成,schemeURL的配置和跳轉(zhuǎn)我就不說(shuō)了,感興趣的可以看我的別的博客,里面都有講述,下面看代碼。
1. cell的點(diǎn)擊方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.activityIndicatorView = [[JJUIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
self.activityIndicatorView.center = self.view.center;
[self.view addSubview:self.activityIndicatorView];
[self.activityIndicatorView startAnimating];
if (indexPath.section == 0) {
switch (indexPath.row) {
//手機(jī)號(hào)
case 0:
{
if (self.mobileBindStr.length < 5) {
NSLog(@"可以綁定手機(jī)號(hào)了");
JJLoginNewUserRegistVC *mobileBindedVC = [[JJLoginNewUserRegistVC alloc] init];
mobileBindedVC.isBindPhoneNum = YES;
[self.navigationController pushViewController:mobileBindedVC animated:YES];
}
}
break;
//QQ號(hào)
case 1:
{
if (!self.isQQBinded) {
NSLog(@"可以綁定QQ號(hào)了");
[SSEThirdPartyLoginHelper loginByPlatform:SSDKPlatformTypeQQ onUserSync:^(SSDKUser *user, SSEUserAssociateHandler associateHandler) {
[self requestLogin:user loginType:SSDKPlatformTypeQQ];
} onLoginResult:^(SSDKResponseState state, SSEBaseUser *user, NSError *error) {
if (state == SSDKResponseStateSuccess) {
NSLog(@"登錄成功");
}
[self.activityIndicatorView stopAnimating];
[self.activityIndicatorView setHidesWhenStopped:YES];
}];
}
}
break;
//微信號(hào)
case 2:
{
if (!self.isWechatBinded) {
NSLog(@"可以綁定微信號(hào)了");
[SSEThirdPartyLoginHelper loginByPlatform:SSDKPlatformTypeWechat onUserSync:^(SSDKUser *user, SSEUserAssociateHandler associateHandler) {
[self requestLogin:user loginType:SSDKPlatformTypeWechat];
} onLoginResult:^(SSDKResponseState state, SSEBaseUser *user, NSError *error) {
if (state == SSDKResponseStateSuccess) {
NSLog(@"登錄成功");
}
[self.activityIndicatorView stopAnimating];
[self.activityIndicatorView setHidesWhenStopped:YES];
}];
}
}
break;
//微博號(hào)
case 3:
{
if (!self.isWeiboBinded) {
NSLog(@"可以綁定微博號(hào)了");
[SSEThirdPartyLoginHelper loginByPlatform:SSDKPlatformTypeSinaWeibo onUserSync:^(SSDKUser *user, SSEUserAssociateHandler associateHandler) {
[self requestLogin:user loginType:SSDKPlatformTypeSinaWeibo];
} onLoginResult:^(SSDKResponseState state, SSEBaseUser *user, NSError *error) {
if (state == SSDKResponseStateSuccess) {
NSLog(@"登錄成功");
}
[self.activityIndicatorView stopAnimating];
[self.activityIndicatorView setHidesWhenStopped:YES];
}];
}
}
break;
default:
break;
}
}
else {
JJLoginForgetPasswordVC *resetPasswordVC = [[JJLoginForgetPasswordVC alloc] init];
[self.navigationController pushViewController:resetPasswordVC animated:YES];
}
}
2. cell的顯示
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0) {
JJPersonCenterSexCell *cell = [tableView dequeueReusableCellWithIdentifier:kJJSettingAccountSecurityVCPhoneReuseIdentify forIndexPath:indexPath];
cell.accountSecurityStr = self.titleArr[indexPath.row];
switch (indexPath.row) {
//手機(jī)號(hào)綁定
case 0:
{
if (self.mobileBindStr.length > 5) {
cell.accountSecurityDetailStr = self.mobileBindStr;
}
else {
cell.accountSecurityDetailStr = @"未綁定";
}
}
break;
//QQ綁定
case 1:
{
if (self.isQQBinded) {
cell.accountSecurityDetailStr = @"已綁定";
}
else{
cell.accountSecurityDetailStr = @"未綁定";
}
}
break;
//微信綁定
case 2:
{
if (self.isWechatBinded) {
cell.accountSecurityDetailStr = @"已綁定";
}
else{
cell.accountSecurityDetailStr = @"未綁定";
}
}
break;
//微博綁定
case 3:
{
if (self.isWeiboBinded) {
cell.accountSecurityDetailStr = @"已綁定";
}
else{
cell.accountSecurityDetailStr = @"未綁定";
}
}
break;
default:
break;
}
return cell;
}
JJPersonCenterSecurityCell *cell = [tableView dequeueReusableCellWithIdentifier:kJJSettingAccountSecurityVCPsdRemakeReuseIdentify forIndexPath:indexPath];
cell.accountSecurityStr = @"重置密碼";
return cell;
}
3. 向我們自己的服務(wù)器發(fā)送請(qǐng)求,實(shí)現(xiàn)綁定
- (void)requestLogin:(SSDKUser *)user loginType:(SSDKPlatformType)loginType
{
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
NSMutableDictionary *paramDict = [self gainParameterWithUser:user loginType:loginType];
[self bindThirdPartyWithParam:paramDict bindType:loginType];
}
- (NSMutableDictionary *)gainParameterWithUser:(SSDKUser *)user loginType:(SSDKPlatformType)loginType
{
NSMutableDictionary *paramDict = [NSMutableDictionary dictionary];
NSString *logAuthTypeType = nil;
switch (loginType) {
case SSDKPlatformTypeWechat:
{
logAuthTypeType = @"2";
}
break;
case SSDKPlatformTypeQQ:
{
logAuthTypeType = @"3";
}
break;
case SSDKPlatformTypeSinaWeibo:
{
logAuthTypeType = @"4";
}
break;
default:
break;
}
switch (user.gender) {
case SSDKGenderMale:
[paramDict setObject:@"1" forKey:@"userSex"];
break;
case SSDKGenderFemale:
[paramDict setObject:@"2" forKey:@"userSex"];
break;
case SSDKGenderUnknown:
[paramDict setObject:@"0" forKey:@"userSex"];
break;
default:
break;
}
NSString *icon = nil;
if (loginType == SSDKPlatformTypeQQ) {
icon = [user.rawData valueForKey:@"figureurl_qq_2"];
} else if(loginType == SSDKPlatformTypeSinaWeibo){
icon = user.icon;
} else if (loginType == SSDKPlatformTypeWechat) {
icon = user.icon;
}
NSString *avatar =[NSString stringWithFormat:@"%@",icon];
[paramDict setObject:user.uid?:@"" forKey:@"authOpenid"]; //openid
[paramDict setObject:logAuthTypeType?:@"" forKey:@"authType"]; //authorType
[paramDict setObject:[user.rawData objectForKey:@"unionid"]?:@"" forKey:@"authUnionid"]; //authUnionid
[paramDict setObject:avatar?:@"" forKey:@"userAvatar"]; //userAvatar
[paramDict setObject:[user.rawData objectForKey:@"city"]?:@"" forKey:@"userCity"]; //userCity
[paramDict setObject:user.nickname?:@"" forKey:@"userNickname"]; //userNickname
[paramDict setObject:[user.rawData objectForKey:@"province"]?:@"" forKey:@"userProvince"]; //userProvince
[paramDict setObject:user.verifyReason?:@"" forKey:@"verifiedReason"]; //verifiedReason
return paramDict;
}
//請(qǐng)求自己的服務(wù)器
- (void)bindThirdPartyWithParam:(NSMutableDictionary *)paramDict bindType:(SSDKPlatformType)bindType
{
if (![JJNetworkReachabilityTool sharedNetworkReachabilityTool].isReachable) {
return;
}
[[JJNetWorkManager manager] requestByPostNetworkWithServerUrl:kPThirdPartyBind parameters:paramDict success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
if ([[responseObject objectForKey:@"code"] integerValue] == 0) {
switch (bindType) {
case SSDKPlatformTypeWechat:
{
self.isWechatBinded = YES;
}
break;
case SSDKPlatformTypeQQ:
{
self.isQQBinded = YES;
}
break;
case SSDKPlatformTypeSinaWeibo:
{
self.isWeiboBinded = YES;
}
break;
default:
break;
}
[self.tableView reloadData];
}
[MBProgressHUD hideHUDForView:self.view animated:YES];
} error:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[MBProgressHUD hideHUDForView:self.view animated:YES];
NSLog(@"error---%@",error);
}];
}
??核心代碼就這么多,相信大家也都能看懂,就不多說(shuō)了,未來(lái)的三天端午假期祝大家過(guò)的愉快。
后記
??三天假期來(lái)了,大家可以休息一下了,哈哈,提前祝大家假期快樂(lè),最近幾天總是一遍遍的回顧08奧運(yùn)北京的開幕式,越看越喜歡,每次看歌唱祖國(guó)升旗的那一段,眼眶都不由得濕潤(rùn),祖國(guó)近現(xiàn)代屈辱了好幾百年,可算慢慢崛起了,希望越走越順,我大的貢獻(xiàn)做不了,希望做好我的本職工作,做到極致,我想就可以了。再次祝大家端午節(jié)快樂(lè)!!!
歌唱祖國(guó)