ios 三方登录(qq、微信)

qq三方登录

1.前往腾讯开放平台注册帐号并创建应用提交审核

1.1 创建应用(帐号的注册此处不做说明)

ios 三方登录(qq、微信)_第1张图片

1.1

1.2 选择iOS,并留意APP ID;APP KEY(后面需要用到)

ios 三方登录(qq、微信)_第2张图片

1.2

1.3 填写相应的信息并保存、提交(一般来说这个审核几个小时内就会通过)

ios 三方登录(qq、微信)_第3张图片

1.3

1.4 审核通过后->管理中心->点击已获取QQ登录能力的应用->点击QQ登录->填写调试者qq

ios 三方登录(qq、微信)_第4张图片

1.41

ios 三方登录(qq、微信)_第5张图片

1.42

2. 导入SDK: 点我下载 ,并进行相关配置

2.1 下载后将TencentOpenAPI.framework和TencentOpenApi_iOS_Bundle.bundle拖入你的项目

ios 三方登录(qq、微信)_第6张图片

2.1

2.2 添加依赖库

点击Project navigator 点击TARGETS -> General -> Linked Frameworks and Libraries->点击加号添加

ios 三方登录(qq、微信)_第7张图片

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”

ios 三方登录(qq、微信)_第8张图片

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

ios 三方登录(qq、微信)_第9张图片

2.4

2.5 ios9以后,需要添加白名单

在info.plist文件中加入 LSApplicationQueriesSchemes

ios 三方登录(qq、微信)_第10张图片

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 下载后将下面文件导入工程目录中

ios 三方登录(qq、微信)_第11张图片

2.1

2.2 添加依赖库

ios 三方登录(qq、微信)_第12张图片

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

ios 三方登录(qq、微信)_第13张图片

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

ios 三方登录(qq、微信)_第14张图片

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

喜欢


13

更多分享

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

收入我的专题

ios开发整理

iOS微信第三方登录实现

ios 三方登录(qq、微信)_第15张图片

注意:代码自己动手写,不要复制! 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

ios 三方登录(qq、微信)_第16张图片

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

ios 三方登录(qq、微信)_第17张图片

 卡卡罗2017

无标题文章

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

 c5e350bc5b40

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

ios 三方登录(qq、微信)_第18张图片

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

 梁杰_numbbbbb

孩子处在叛逆期怎么办?

ios 三方登录(qq、微信)_第19张图片

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

 安羽心理

2017-05-25

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

 meet_again

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

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

ios 三方登录(qq、微信)_第20张图片

 好报非非

大姑二姑

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

 花智勇

你可能感兴趣的:(ios 三方登录(qq、微信))