1、QQ登錄
導(dǎo)入SDK消恍、設(shè)置URL types 以及Schemes就不說了岂昭,這邊只有導(dǎo)入成功后,調(diào)起的代碼:
AppDelegate.m
記得導(dǎo)入#import <TencentOpenAPI/TencentOAuth.h>
//9.0之后
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
if ([url.host isEqualToString:@"oauth"])//微信登錄
{
return [WXApi handleOpenURL:url delegate:self];
}
else if ([url.host isEqualToString:@"qzapp"])//QQ登錄
{
return [TencentOAuth HandleOpenURL:url];
}
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
if ([url.host isEqualToString:@"oauth"])//微信登錄
{
return [WXApi handleOpenURL:url delegate:self];
}
else if ([url.host isEqualToString:@"qzapp"])
{
return [TencentOAuth HandleOpenURL:url];
}
return YES;
}
QQ登錄按鈕:
記得導(dǎo)入#import <TencentOpenAPI/TencentOAuth.h>以及遵守TencentSessionDelegate協(xié)議
聲明 TencentOAuth為全局,如果沒有聲明為全局可能在回調(diào)代理方法時(shí)不走狠怨。
TencentOAuth * tencentOAuth;
按鈕方法中調(diào)起QQ:
tencentOAuth = [[TencentOAuth alloc] initWithAppId:qqAppid andDelegate:self];
NSArray * permissions = [NSArray arrayWithObjects:@"get_user_info",@"get_simple_userinfo", @"add_t", nil];
[tencentOAuth authorize:permissions];
//實(shí)現(xiàn)TencentSessionDelegate代理:
- (void)tencentDidLogin{
if (tencentOAuth.accessToken && 0 != [tencentOAuth.accessToken length])
{
// 記錄登錄用戶的OpenID约啊、Token以及過期時(shí)間
[tencentOAuth getUserInfo];
}
else
{
NSLog(@"登錄不成功 沒有獲取accesstoken");
}}
- (void)getUserInfoResponse:(APIResponse *)response {
// 獲取用戶信息
if (response && response.retCode == URLREQUEST_SUCCEED) {
NSDictionary *userInfo = [response jsonResponse];
NSString *nickName = userInfo[@"nickname"];
// 后續(xù)操作...
} else {
NSLog(@"QQ auth fail ,getUserInfoResponse:%d", response.detailRetCode);
}
}
2、微信登錄
與QQ一樣在Applegate.m文件中佣赖,指定返回路徑在QQ登錄那邊就有加判斷了恰矩,微信登錄的代碼:
#import "WXApi.h"
按鈕方法:
//構(gòu)造SendAuthReq結(jié)構(gòu)體
SendAuthReq* req = [[SendAuthReq alloc]init];
req.scope = @"snsapi_userinfo" ;
req.state = @"app" ;//記得更改標(biāo)識(shí)
//第三方向微信終端發(fā)送一個(gè)SendAuthReq消息結(jié)構(gòu)
[WXApi sendReq:req];
在Applegate.m文件中實(shí)現(xiàn)微信回調(diào)方法,當(dāng)然記得遵守微信的協(xié)議WXApiDelegate:
#pragma mark - 微信
- (void)onResp:(BaseResp *)resp{
if ([resp isKindOfClass:[SendAuthResp class]])//授權(quán)
{
SendAuthResp *temp = (SendAuthResp *)resp;
NSString *accessUrlStr = [NSString stringWithFormat:@"%@oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code", wxAppUrl,wxAppid, wxAppSecret, temp.code];
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
//請(qǐng)求accessToken憎蛤、openID
[manager GET:accessUrlStr parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSString* accessToken=[responseObject valueForKey:@"access_token"];
NSString* openID=[responseObject valueForKey:@"openid"];
NSString *userUrlStr = [NSString stringWithFormat:@"%@userinfo?access_token=%@&openid=%@", wxAppUrl, accessToken, openID];
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
//請(qǐng)求個(gè)人信息
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
[manager GET:userUrlStr parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//返回個(gè)人信息
//處理返回信息外傅,可用通知傳到登錄界面
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
}
}
總的就這些,就是自己處理比較麻煩一點(diǎn)俩檬,不像第三方那樣直接一句話調(diào)用萎胰,需要自己處理,當(dāng)然會(huì)弄之后可以自己封裝一個(gè)棚辽。