qq三方登录
1.前往腾讯开放平台注册帐号并创建应用提交审核
1.1 创建应用(帐号的注册此处不做说明)
1.1
1.2 选择iOS,并留意APP ID;APP KEY(后面需要用到)
1.2
1.3 填写相应的信息并保存、提交(一般来说这个审核几个小时内就会通过)
1.3
1.4 审核通过后->管理中心->点击已获取QQ登录能力的应用->点击QQ登录->填写调试者qq
1.41
1.42
2. 导入SDK: 点我下载 ,并进行相关配置
2.1 下载后将TencentOpenAPI.framework和TencentOpenApi_iOS_Bundle.bundle拖入你的项目
2.1
2.2 添加依赖库
点击Project navigator 点击TARGETS -> General -> Linked Frameworks and Libraries->点击加号添加
2.2
需要添加的依赖库:
”Security.framework”;“libiconv.tbd”;“SystemConfiguration.framework”;“CoreGraphics.Framework”;“libsqlite3.tbd”;“CoreTelephony.framework”;“libstdc++.tbd”;“libz.tbd”。
2.3 修改配置属性
点击Project navigator 点击TARGETS -> Build Settings ->Linking->Other Linker Flags->点击加号添加属性值“-fobjc-arc”
2.3
2.4 添加URL Scheme
点击Project navigator 点击TARGETS ->info ->URL type-> 添加URL type
Identifier 填写:tencentopenapi
URL Scheme填写: tencent +APP ID(APP ID: 从上文1.2中科获得)
🍐 :你的APP ID是1234567 则填入tencent1234567
2.4
2.5 ios9以后,需要添加白名单
在info.plist文件中加入 LSApplicationQueriesSchemes
2.5
2.6 针对iOS9默认使用https,现在先还原成http请求方式
第一步:在plist中添加NSAppTransportSecurity项,此项为NSDictionary
第二步:在NSAppTransportSecurity下添加 NSAllowsArbitraryLoads类型为Boolean,value为YES
2.6
3.代码区
3.1 在Appdelegate.m中
导入并重写两个方法
#import
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation{return[TencentOAuth HandleOpenURL:url];}- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url{return[TencentOAuth HandleOpenURL:url];}
3.2 在ThirdLogin.m(用于封装三方登录的类)中
#import"ThirdLogin.h"#import#import"HttpClient.h"#define NAME @"name"#define PICTURE @"picture"#define OPENID @"openId"@interfaceThirdLogin(){ TencentOAuth *tencentOAuth;NSArray*permissions;}@property(copy,nonatomic)void(^success)(NSDictionary*result);@property(copy,nonatomic)void(^failure)(NSError*error);@end@implementationThirdLogin#pragma mark--------------------------------------------------------#pragma mark qq三方登录// 对外的api: 即点击qq三方登录按钮,调这个方法- (void)qqLoginWithSuccess:(void(^)(NSDictionary*userInfo))success failure:(void(^)(NSError*error))failure {// 成功或失败的回调block self.success = [successcopy];self.failure = [failurecopy];// 需要放在主线程中执行 dispatch_async(dispatch_get_main_queue(), ^{ tencentOAuth=[[TencentOAuth alloc]initWithAppId:@"1105549185"andDelegate:self];// 设置需要的权限列表,此处尽量使用什么取什么。permissions= [NSArrayarrayWithObjects:kOPEN_PERMISSION_GET_USER_INFO, kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,@"add_t",nil]; [tencentOAuth authorize:permissions]; });}- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray*)permissions {returnYES;}#pragma mark -- TencentSessionDelegate//登陆完成调用- (void)tencentDidLogin{if(tencentOAuth.accessToken &&0!= [tencentOAuth.accessToken length]) {// 记录登录用户的OpenID、Token以及过期时间[tencentOAuth getUserInfo]; }else{ [selffailureWith:@"未授权成功"]; }}//非网络错误导致登录失败:-(void)tencentDidNotLogin:(BOOL)cancelled{if(cancelled){ [selffailureWith:@"用户取消登录"]; }else{ [selffailureWith:@"登录失败"]; }}// 网络错误导致登录失败:-(void)tencentDidNotNetWork { [selffailureWith:@"网络错误"];}- (void)tencentDidLogout{// NSLog(@"登出");}-(void)getUserInfoResponse:(APIResponse *)response {NSDictionary*result = [NSDictionarydictionaryWithObjectsAndKeys:[response.jsonResponse objectForKey:@"nickname"], [response.jsonResponse objectForKey:@"figureurl_qq_2"], tencentOAuth.openId, NAME, PICTURE, OPENID,nil];self.success(result);}- (void)failureWith:(NSString*)domin {NSError*error = [NSErrorerrorWithDomain:domin code:0userInfo:nil];self.failure(error);}
补充:
登陆成功的方法里面调用[tencentOAuth getUserInfo];然后系统会调用一个方法(我们需要提前实现)-(void)getUserInfoResponse:(APIResponse*)response{}
在getUserInfoResponse中可以得到所需要的用户信息
微信三方登录
1.前往微信开放平台注册帐号并创建应用提交审核
在微信开放平台注册开发者帐号并创建应用,审核通过后,获得相应的AppID和AppSecret,基本流程和qq三方登录类似(这里不做说明)
2. 导入SDK: 点我下载 ,并进行相关配置
2.1 下载后将下面文件导入工程目录中
2.1
2.2 添加依赖库
2.2
需要添加的依赖库:
“SystemConfiguration.framework”;“CoreTelephony.framework”;“libsqlite3.0.tbd”;“libstdc++.tbd”;“libz.tbd”;"libWeChatSDK.a"
2.3 添加URL Scheme
点击Project navigator 点击TARGETS ->info ->URL type-> 添加URL type
Identifier 填写:可自定义
URL Scheme填写: APP ID(APP ID: 从上文1.2中科获得)
🍐 :你的APP ID是wx1234567 则填入wx1234567
2.3
2.4 ios9以后,需要添加白名单
在info.plist文件中加入 LSApplicationQueriesSchemes
2.4
2.5 针对iOS9默认使用https,现在先还原成http请求方式
第一步:在plist中添加NSAppTransportSecurity项,此项为NSDictionary
第二步:在NSAppTransportSecurity下添加 NSAllowsArbitraryLoads类型为Boolean,value为YES
need-to-insert-img
2.6
3.代码区
3.1 在Appdelegate.m中
#import"AppDelegate.h"#import"WXApi.h"#import"ThirdLogin.h"// 用于封装三方登录的类@interfaceAppDelegate()@end@implementationAppDelegate- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {// @"wx1235467" : APP ID[WXApi registerApp:@"wx1235467"withDescription:@"Wechat"];returnYES;}// 这个方法是用于从微信返回第三方App- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {// 这里我的代理设置的是ThirdLogin对象,有的直接设self(即AppDelegate)[WXApi handleOpenURL:url delegate:[ThirdLogin shareThirdLogin]];returnYES;}
3.1 在ThirdLogin.m中
#import"ThirdLogin.h"#import"HttpClient.h"#import"WXApi.h"#define NAME @"name"#define PICTURE @"picture"#define OPENID @"openId"@interfaceThirdLogin()@property(copy,nonatomic)void(^success)(NSDictionary*result);@property(copy,nonatomic)void(^failure)(NSError*error);@end#pragma mark--------------------------------------------------------#pragma mark 微信三方登录// 对外的api: 即点击微信三方登录按钮,调这个方法- (void)weixinLoginWithsuccess:(void(^)(NSDictionary*userInfo))success failure:(void(^)(NSError*error))failure {// 成功或失败的回调blockself.success = [successcopy];self.failure = [failurecopy];NSString*accessToken = [[NSUserDefaultsstandardUserDefaults] objectForKey:WX_ACCESS_TOKEN];NSString*openID = [[NSUserDefaultsstandardUserDefaults] objectForKey:WX_OPEN_ID];// 如果已经请求过微信授权登录,那么考虑用已经得到的access_tokenif(accessToken && openID) { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];NSString*refreshToken = [[NSUserDefaultsstandardUserDefaults] objectForKey:WX_REFRESH_TOKEN];NSString*refreshUrlStr = [NSStringstringWithFormat:@"%@/oauth2/refresh_token?appid=%@&grant_type=refresh_token&refresh_token=%@", WX_BASE_URL, WXPatient_App_ID, refreshToken]; [manager GET:refreshUrlStr parameters:nilsuccess:^(AFHTTPRequestOperation *operation,idresponseObject) {NSLog(@"请求reAccess的response = %@", responseObject);NSDictionary*refreshDict = [NSDictionarydictionaryWithDictionary:responseObject];NSString*reAccessToken = [refreshDict objectForKey:WX_ACCESS_TOKEN];// 如果reAccessToken为空,说明reAccessToken也过期了,反之则没有过期if(reAccessToken) {// 更新access_token、refresh_token、open_id[[NSUserDefaultsstandardUserDefaults] setObject:reAccessToken forKey:WX_ACCESS_TOKEN]; [[NSUserDefaultsstandardUserDefaults] setObject:[refreshDict objectForKey:WX_OPEN_ID] forKey:WX_OPEN_ID]; [[NSUserDefaultsstandardUserDefaults] setObject:[refreshDict objectForKey:WX_REFRESH_TOKEN] forKey:WX_REFRESH_TOKEN]; [[NSUserDefaultsstandardUserDefaults] synchronize];// reAccessToken不为空说明未超时,直接执行wechatLoginByRequestForUserInfo方法获取数据if([selfrespondsToSelector:@selector(wechatGetUserInfo)]) { [selfwechatGetUserInfo]; } }else{// refresh_token失效的后需重新授权[selfwechatLogin]; } } failure:^(AFHTTPRequestOperation *operation,NSError*error) { [selffailureWith:@"请求失败"]; }]; }else{// 本地保存的accessToken、openID为空,说明是第一次登陆,或者数据遗失[selfwechatLogin]; }}- (void)wechatLogin {if([WXApi isWXAppInstalled]) { SendAuthReq *req = [[SendAuthReq alloc] init]; req.scope =@"snsapi_userinfo"; req.state =@"App"; [WXApi sendReq:req]; }else{//把微信登录的按钮隐藏掉。}}- (void)wechatGetUserInfo { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];NSString*accessToken = [[NSUserDefaultsstandardUserDefaults] objectForKey:WX_ACCESS_TOKEN];NSString*openID = [[NSUserDefaultsstandardUserDefaults] objectForKey:WX_OPEN_ID];NSString*userUrlStr = [NSStringstringWithFormat:@"%@/userinfo?access_token=%@&openid=%@", WX_BASE_URL, accessToken, openID];// 请求用户数据[manager GET:userUrlStr parameters:nilsuccess:^(AFHTTPRequestOperation *operation,idresponseObject) {NSDictionary*result = [NSDictionarydictionaryWithObjectsAndKeys:responseObject[@"nickname"], responseObject[@"headimgurl"], openID, NAME, PICTURE, OPENID,nil];self.success(result); } failure:^(AFHTTPRequestOperation *operation,NSError*error) { [selffailureWith:@"请求失败"]; }];}/*====================delegate方法=====================*/-(void) onResp:(BaseResp*)resp{ SendAuthResp *temp = (SendAuthResp *)resp; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];NSString*accessUrlStr = [NSStringstringWithFormat:@"%@/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code", WX_BASE_URL, WXPatient_App_ID, WXPatient_App_Secret, temp.code]; [manager GET:accessUrlStr parameters:nilsuccess:^(AFHTTPRequestOperation *operation,idresponseObject) {NSDictionary*accessDict = [NSDictionarydictionaryWithDictionary:responseObject];NSString*accessToken = [accessDict objectForKey:WX_ACCESS_TOKEN];NSString*openID = [accessDict objectForKey:WX_OPEN_ID];NSString*refreshToken = [accessDict objectForKey:WX_REFRESH_TOKEN];// 本地持久化,以便access_token的使用、刷新或者持续if(accessToken && ![accessToken isEqualToString:@""] && openID && ![openID isEqualToString:@""]) { [[NSUserDefaultsstandardUserDefaults] setObject:accessToken forKey:WX_ACCESS_TOKEN]; [[NSUserDefaultsstandardUserDefaults] setObject:openID forKey:WX_OPEN_ID]; [[NSUserDefaultsstandardUserDefaults] setObject:refreshToken forKey:WX_REFRESH_TOKEN]; [[NSUserDefaultsstandardUserDefaults] synchronize];// 命令直接同步到文件里,来避免数据的丢失} [selfwechatGetUserInfo]; } failure:^(AFHTTPRequestOperation *operation,NSError*error) { [selffailureWith:@"请求失败"]; }];}
补充:
access_token 接口调用凭证
refresh_token 用户刷新access_token
openid 授权用户唯一标识
access_token有效期为2小时,当再次登陆时通过refresh_token进行刷新,有两种情况:
access_token未超时,access_token不会改变,但超时时间会刷新,相当于续期access_token。
超时,那么会获取一个新的access_token,新的超时时间;
注:refresh_token拥有有效期:30天
Comments
如有错误,望指正
小礼物走一走,来简书关注我
赞赏支持
© 著作权归作者所有
写了 14452 字,被 34 人关注,获得了 84 个喜欢
被以下专题收入,发现更多相似内容
ios开发整理
注意:代码自己动手写,不要复制! GitHub 一、接入微信第三方登录准备工作。 移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用...
大冲哥
iOS -第三方登录(SSO授权)原生接入(微博,QQ,微信)
原文网址:http://www.jianshu.com/p/7e3c5fc31708 0.demo说明别的先不说demo地址如下1.demo下载下来以后,请在WTThirdPartyLoginManager里面将自己的个平台的app key写上去.2.URL Schemes...
枫之叶_小乙哥
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
卡卡罗2017
# 一度蜜v3.0协议 --- # 交互协议 [TOC] ## 协议说明 ### 请求参数 下表列出了v3.0版协议需要的内置请求参数,对于必选的参数在所有请求中都需要填写 | 名称 | 必选 | 类型 | 说明 | |---...
c5e350bc5b40
如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
作者:Gabriel Theodoropoulos,原文链接,原文日期:2016-1-3译者:小铁匠Linus;校对:千叶知风;定稿:小锅 从很久以前开始,社交网络就成为了我们每天生活的一部分了。同时,社交网络也是我们程序员生活的一部分,绝大多数的应用都对进行了集成,用于接...
梁杰_numbbbbb
文/安羽心理咨询 有些家长家里不管家里是否有财有势,还是没钱没势,总是想办法帮助孩子摆平所有的事情,满足孩子所有的要求,为孩子安排好一切,甚至可能现在大部分的努力都是为了让孩子以后可以生活得更好。 但是却发现孩子渐渐的不跟父母沟通了,孩子只会在想要东西的时候才会跟父母提要求...
安羽心理
好吧,第一次撞车,把整块保险杠都掀了下来。 以后还是开慢点吧,别让关心变成担心。
meet_again
开年新读了四本书:《我不是潘金莲》、《怦然心动》、《月亮与六便士》和《二十年目睹之怪现状》,都是值得推荐的好书。 聊聊《怦然心动》吧。读的是中文电子版,书的封面上写着一句:“你从未忘记过你的初恋。”用初恋情结进行兜售,其实是一个关于成长的美丽故事,所以这本书适宜的年龄跨度很...
好报非非
父亲这一辈,兄妹三人,父亲老大,两个姑姑是他的妹妹。 大姑叫花彩芹,中等身材,长相漂亮,在农村,属于能干聪明型的女子。 大姑是什么时候出嫁的,我没记忆,只知道所嫁之家,离我家不远,在长安东大乡郭湾村,家庭殷实,生活富足,在困难时期,令人羡慕,村里人都说我...
花智勇