ios 三方登录(qq、微信)

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

如有错误,望指正

小礼物走一走,来简书关注我

赞赏支持

 ios随笔

© 著作权归作者所有

举报文章

关注fjytqiu

写了 14452 字,被 34 人关注,获得了 84 个喜欢

喜欢


13

更多分享

被以下专题收入,发现更多相似内容

收入我的专题

ios开发整理

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为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...

 卡卡罗2017

无标题文章

# 一度蜜v3.0协议 --- # 交互协议 [TOC] ## 协议说明 ### 请求参数 下表列出了v3.0版协议需要的内置请求参数,对于必选的参数在所有请求中都需要填写 | 名称 | 必选 | 类型 | 说明 | |---...

 c5e350bc5b40

如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用

作者:Gabriel Theodoropoulos,原文链接,原文日期:2016-1-3译者:小铁匠Linus;校对:千叶知风;定稿:小锅 从很久以前开始,社交网络就成为了我们每天生活的一部分了。同时,社交网络也是我们程序员生活的一部分,绝大多数的应用都对进行了集成,用于接...

 梁杰_numbbbbb

孩子处在叛逆期怎么办?

文/安羽心理咨询 有些家长家里不管家里是否有财有势,还是没钱没势,总是想办法帮助孩子摆平所有的事情,满足孩子所有的要求,为孩子安排好一切,甚至可能现在大部分的努力都是为了让孩子以后可以生活得更好。 但是却发现孩子渐渐的不跟父母沟通了,孩子只会在想要东西的时候才会跟父母提要求...

 安羽心理

2017-05-25

好吧,第一次撞车,把整块保险杠都掀了下来。 以后还是开慢点吧,别让关心变成担心。

 meet_again

《怦然心动》,总有细节令你心动

开年新读了四本书:《我不是潘金莲》、《怦然心动》、《月亮与六便士》和《二十年目睹之怪现状》,都是值得推荐的好书。 聊聊《怦然心动》吧。读的是中文电子版,书的封面上写着一句:“你从未忘记过你的初恋。”用初恋情结进行兜售,其实是一个关于成长的美丽故事,所以这本书适宜的年龄跨度很...

 好报非非

大姑二姑

父亲这一辈,兄妹三人,父亲老大,两个姑姑是他的妹妹。 大姑叫花彩芹,中等身材,长相漂亮,在农村,属于能干聪明型的女子。 大姑是什么时候出嫁的,我没记忆,只知道所嫁之家,离我家不远,在长安东大乡郭湾村,家庭殷实,生活富足,在困难时期,令人羡慕,村里人都说我...

 花智勇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容