近两年半没有工作,重新回到技术岗位,脸大的我竟然一丁点不恐惧,不知道其他宝妈会有同样的感受吗?在新公司的第二周被安排给之前的一个项目改bug,第二个任务是一个社交的App,其中有通过第三方快速登录的功能,不瞒大家说,第一次接触(14年毕业就做iOS开发,成长神一般的慢)。
正题:最最好的方式是官方文档
除此之外百度 不好意思地说 我“百家抄袭”了一下。除了微信登录 还附加了分享哈哈~(有图片更高效,本人能力有限,不大喜欢读长长的只有文字的技术文章嘻哈)
1、集成SDK
1.1、(手动集成)下载并解压SDK:下载链接,并拖拽 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个文件到Xcode⼯工程内。
1.2、(通过CocoaPods集成)
pod 'WechatOpenSDK'
2、添加依赖库(CocoaPods集成的不用添加)
SystemConfiguration.framework
libz.tbd
libsqlite3.0.tbd
libc++.tbd
CoreTelephony.framework
3、新增⼀一条URL Scheme:选中⼯工程Target -> Info -> URLTypes;
identifier随便写,URL scheme写成微信开放平台申请的appid
4、添加⽩白名单:LSApplicationQueriesSchemes新增⽩名单****
5、AppDelegate中向微信注册Appid,并添加处理回调的代码
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
return [WXApi handleOpenURL:url delegate:self];
}
A:
1、微信登录
微信回调后如果还需要获取个人信息 在官方文档中有相关的URL,下面的是我公司实际用到的 仅供参考
在appdelegate中加通知//微信登录回调
-(void)onResp:(BaseResp *)resp{
[[NSNotificationCenter defaultCenter] postNotificationName:@"wxcbk" object:resp];
}
在对应类中添加接收者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(wxcbk:) name:@"wxcbk" object:nil];
之后是通知方法
-(void)wxcbk:(NSNotification *)noti{
SendAuthResp *resp = noti.object;
NSString *url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",KWXAPPID,KWXSECRET,resp.code];
[[Httprequest share] postObjectByParameters:nil andUrl:url showLoading:YES showMsg:NO isFullUrk:YES andComplain:^(id obj) {
if (obj) {
NSString *openid = obj[@"openid"];
if (openid) {
NSString *access_token = obj[@"access_token"];
// https://api.weixin.qq.com/sns/userinfo?access_token=&openid=&lang=zh_CN;
NSString *url2 = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@&lang=zh_CN",access_token,openid];
[[Httprequest share] postObjectByParameters:nil andUrl:url2 showLoading:YES showMsg:NO isFullUrk:YES andComplain:^(id obj) {
if (obj) {
self->user_nickname = obj[@"nickname"];
self->avatar = obj[@"headimgurl"];
self->openid = openid;
[self fastLogin:2];
}
} andError:^(id error) {
}];
}
}
} andError:^(id error) {
}];
}
B:
QQ登陆
第一步:不管是QQ登录还是微信登录,先让产品同事去开放平台申请APP ID和APP密钥;
第二步:下载SDK
1、QQ登录(只能从开放平台下载SDK)
http://wiki.open.qq.com/wiki/mobile/SDK下载
2、微信登录(可以从开放平台下载SDK,也可以通过cocoapods下载安装)
直接从开放平台下载SDK
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN
基于iOS实现APP的第三方QQ登陆。接入第三方SDK时的一个主要的步骤:
找到相关的开放平台。QQ互联平台,http://connect.qq.com/;
注冊成功后创建自己的APP。填写一堆基本信号后获得一个App_Key,就是你APP的唯一识别码。
下载相应的SDK,而且阅读当中的开发文档或demo,通常看开发文档比較直观。假设看demo,有些SDK的demo简直不忍直视;
嵌入SDK中相应功能,測试成功后提交第三方平台审核,等审核通过后就能够正式接入第三方SDK的功能了;
完毕全部功能后就提交AppStore审核吧,大概一周左右就可以。
一,QQ登录授权开发:
1,依照开发文档导入SDK,然后把注冊成功后获取到的Key增加到Url Schemes中,比如:tencent1101737816。注意这些文档写的非常清楚。
2,在AppDelegate.m中实现以下方法。注意。直接复制代码,两者写其一就可以,当然了别忘了引入头文件,这是用作返回APP时候用的回调函数。
- (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。注冊并授权。注意授权这里会出现故障
<span style="white-space:pre"> </span>NSArray *_permissions = [NSArray arrayWithObjects:kOPEN_PERMISSION_GET_INFO, kOPEN_PERMISSION_GET_USER_INFO, kOPEN_PERMISSION_GET_SIMPLE_USER_INFO, nil];<span style="white-space:pre"> </span>[_tencentOAuth authorize:_permissions inSafari:NO]; //授权</span>
4,实现登录成功与否的回调函数,实现协议TencentSessionDelegate,代码例如以下:
- (void)tencentDidLogin { _labelTitle.text = @"登录完毕"; if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length]){ // 记录登录用户的OpenID、Token以及过期时间 _labelAccessToken.text = _tencentOAuth.accessToken; }else{ _labelAccessToken.text = @"登录不成功 没有获取accesstoken"; } } -(void)tencentDidNotLogin:(BOOL)cancelled { if (cancelled){ _labelTitle.text = @"用户取消登录"; }else{ _labelTitle.text = @"登录失败"; } } -(void)tencentDidNotNetWork { _labelTitle.text=@"无网络连接,请设置网络"; }
5。假设代码能走到登录完毕这里。而且获得了accesstoken,那说明我们的登录流程就走完了,剩下的旧是获取用户详细的信息了。如昵称,城市等等。
6。怎样获取昵称呢,文档提供了这样一个方法
[_tencentOAuth getUserInfo];
可是返回类型是个BOOL类似,非常多朋友就郁闷了,这是什么情况。经过看代码,发现假设开发人员调用了这种方法,假设成功则会实现以下协议TencentSessionDelegate里面的回调函数:
-(void)getUserInfoResponse:(APIResponse *)response
{
// NSLog(@"respons:%@",response.jsonResponse);
self.name.text = [response.jsonResponse objectForKey:@"nickname"];
}
这样就能得到我们想要的昵称等信息,到这里就算完毕了我们的QQ登录授权了。剩下的就是发给后台这些登录信息,而且保持授权成功后的token等。看官方文档说明。
C:
支付宝登录
支付宝【登录Only】AFAuthSDK下载入口.
参考官方文档
1、开发者网站申请与配置
和大多数的三方一样,需要申请成为开发者-注册app-生成appID等。
主要是appID和配置你需要用支付宝的哪些功能。这里我选择了
· 获取会员信息
· 第三方授权1
配置好后提交审核即可。这里暂时用不到支付宝给我们提供的沙盒模式,那个用于支付功能测试不错的。
2、回到项目
将下载好的sdk拖入工程中。并配置项目的Link Binary如图:
登录:“AFAuthSDK.framework”
登录+支付:“AlipaySDK.framework”
按需集成,这里说明一点。以前由于上架审核的机制问题,所以都是AlipaySDK,但是Apple自从2018年1月左右审核机制对于支付功能的规范后,导致很多app上架失败。针对这个问题,微信、支付宝等三方登录均将授权登录部分单独提供sdk(auth_login_only)。
3、别急,到代码了
· import <AFAuthSDK/AFAuthSDK.h>
//你在info中/或plist中设置的appScheme
NSString *appScheme = @"你的appScheme";
//authStr参数后台获取!和开发中心配置的app有关系,包含appid\name等等信息。
NSString *authStr = @"后台获取的authStr";
//没有安装支付宝客户端的跳到网页授权时会在这个方法里回调
[[AFAuthSDK defaultService] authv2WithInfo:authStr fromScheme:appScheme callback:^(NSDictionary *result) {
// 解析 auth code
NSString *resultString = result[@"result"];
NSString *authCode = nil;
if (resultString.length>0) {
NSArray *resultArr = [resultString componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"resultString = %@",resultString);
// NSLog(@"authv2WithInfo授权结果 authCode = %@", authCode?:@"");
}];
4、不调用block?
写完以上代码会发现并不能回调。解决:
在你的appdelegate中继续写:
以上也是在只用到支付宝登录,不需要支付的时候最简洁的做法了把。
不用到支付功能的真的没必要使用AliPaySDK.framework.
当然,你也可以使用友盟、shareSDK等方式集成,借助于后者的不利就是多集成很多无效垃圾代码。当然,凡事阴阳,后者的便利是在于我们需要集成微信、新浪、微博、支付宝、QQ、Twitter、Facebook等一大大大大大堆的三方登录。
Tips:shareSDK对国外平台的集成比较友好,友盟SDK最近一段时间没用过不知道。
简洁且简单.
作者:甜行僧
链接:https://www.jianshu.com/p/341a51ba8b75
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
以上是转载上面这位作者的
我们公司的具体是这样做的,将需要的各种参数被后台技术整合成一个字符串,
- (void)doAPAuth
{
NSString *pid = @"11111111111111";
NSString *appID = @"222222222222";
NSString *rsaPrivateKey = @"";
//生成 auth info 对象
APAuthInfo *authInfo = [APAuthInfo new];
authInfo.pid = pid;
authInfo.appID = appID;
NSString *appScheme = @"haomeipoAFAuth";
//auth type
NSString *authType = [[NSUserDefaults standardUserDefaults] objectForKey:@"authType"];
if (authType) {
authInfo.authType = authType;
}
NSString *url = @"http:33333333333333333333";
[[Httprequest share]postObjectByParameters:nil andUrl:url showLoading:YES showMsg:YES isFullUrk:YES andComplain:^(id obj) {
if (obj) {
NSDictionary *appID = obj[@"data"];
if (appID) {
NSString *appOpenID = appID[@"sign_str"];
NSLog(@"%@",appOpenID);
[[AFAuthSDK defaultService]authv2WithInfo:appOpenID fromScheme:appScheme callback:^(NSDictionary *result) {
appOpenID这个是在官方平台申请的appID
NSString *resultStr = result[@"result"];
NSArray *resulyArray = [resultStr componentsSeparatedByString:@"&"];
NSLog(@"%@",resulyArray);
for (int i = 0; i<resulyArray.count;i++) {
if ([resulyArray[i] rangeOfString:@"auth_code"].location == NSNotFound) {
} else {
NSString *auth_code = [resulyArray[i] substringFromIndex:10];
self->openid = auth_code;
[self fastLogin:3];//3是我们公司设定的支付宝登录方式的type值
}
}
}];
}
}
} andError:^(id error) {
}];
}
-(void)fastLogin:(int)type{
// 1:QQ,2:微信,3:支付宝
[LoadingView showLoading];
__weak typeof(self) weakSelf = self;
[CBBaseModel request:@"user/public/oauth_login" par:@{@"openid":openid?:@"",@"oauth_type":@(type),@"user_nickname":user_nickname?:@"",@"avatar":avatar?:@""} callback:^(id _Nonnull data, NSString * _Nonnull msg) {
NSDictionary * ditt = [[NSDictionary alloc] init];
if (ISDIC(data)) {
ditt = data;
if (ditt && ditt.count ) {
[weakSelf judgeLoginRes:ditt];
}
}
}];
}
如果想进一步了解或者有问题我们qq联系呗~502793126,记得备注你是嘎哈的,为啥子找菜鸟级别聊天。
4月9日写的博客
4月11日发现我在qq三方登陆时传给后台的openID是错误的 误以为是appID 而实际的openID是登录成功后在回调函数里获取的token,表笑话我 ,细想想openID怎么能写死了,不同用户肯定不一样啊 这么大的bug我还好意思说,目的不是要说明这两个参数,而是反思。下面附上我改过的获取正确token(也就是openID)的代码。
-(void)qqLogin{
NSArray *permissions = [NSArray arrayWithObjects:@"get_user_info", @"get_simple_userinfo", @"add_t", nil];
[_tencentOAuth authorize:permissions inSafari:NO];
}
- (void)tencentDidLogin
{
NSLog(@"登陆完成");
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length])
{
// 记录登录用户的OpenID、Token以及过期时间
[_tencentOAuth getUserInfo];
}else{
[LoadingView showAMessage:[TencentOAuth getLastErrorMsg]];
}
}
-(void)getUserInfoResponse:(APIResponse *)response{
if (response.retCode ==URLREQUEST_SUCCEED){
[[NSNotificationCenter defaultCenter] postNotificationName:@"qqcbk" object:response.jsonResponse];
[[NSNotificationCenter defaultCenter] postNotificationName:@"qqtoken" object:_tencentOAuth.accessToken];
}else{
[LoadingView showAMessage:@"获取用户信息失败"];
}
}