iOS 三方登录非友盟等而是“ 微信 QQ 支付宝” 简单总结

版权声明:没有版权,随意转载,谢谢赏识,不胜感激。 https://blog.csdn.net/u011217834/article/details/89130112

近两年半没有工作,重新回到技术岗位,脸大的我竟然一丁点不恐惧,不知道其他宝妈会有同样的感受吗?在新公司的第二周被安排给之前的一个项目改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支付宝登录授权SDK调用方法
  2. App支付宝登录快速接入

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:@"获取用户信息失败"];

    }

        

      

}

猜你喜欢

转载自blog.csdn.net/u011217834/article/details/89130112