文档章节

iOS实战:第三方登陆weibo/weixin/qq集成

ONEPIECE_iOS
 ONEPIECE_iOS
发布于 2015/10/23 14:59
字数 1207
阅读 38
收藏 1
点赞 0
评论 0

一、前篇:去各个官网找相应sdk和教程
Weixin官方iOS接入指南和代码实例下载
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417694084&token=&lang=zh_CN
qq文档
http://wiki.open.qq.com/wiki/API3.0%E6%96%87%E6%A1%A3#.E5.85.AC.E5.85.B1.E5.8F.82.E6.95.B0.E8.AF.B4.E6.98.8E
http://wiki.open.qq.com/wiki/%E8%85%BE%E8%AE%AF%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%94%E7%94%A8%E7%AD%BE%E5%90%8D%E5%8F%82%E6%95%B0sig%E7%9A%84%E8%AF%B4%E6%98%8E


weibo
http://open.weibo.com/wiki/2/users/show


2.分析

大概都分3步,发送请求并回调,回调中处理返回结果,根据返回结果再去请求下一步。

3.info.plist里配置对应URL types

4.代码

AppDelegate.h
#import "WXApi.h"
#import "WeiboSDK.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate, WXApiDelegate,WeiboSDKDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
AppDelegate.m
#pragma mark - Init PlatValue
- (void)initializeSharePlat
{
    //注册初始化参数
    //weibo
    [WeiboSDK enableDebugMode:YES];
    [WeiboSDK registerApp:kWeiboAppKey];    
    //weixin
    [WXApi registerApp:kWeiXinAppKey];
    //qq也可以不在这里初始化,直接在需要的页面中初始化,本项目暂只用于登陆,在这可以不初始化
//    TencentOAuth * _oauth = [[TencentOAuth alloc] initWithAppId:kTencentAppKey andDelegate:self];
}

#pragma mark -
#pragma mark openURL
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{    return [WeiboSDK handleOpenURL:url delegate:self] || [WXApi handleOpenURL:url delegate:self] || [TencentOAuth HandleOpenURL:url];
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{    return [WeiboSDK handleOpenURL:url delegate:self] || [WXApi handleOpenURL:url delegate:self] || [TencentOAuth HandleOpenURL:url];
}
#pragma mark - Weixin

- (void)onReq:(BaseReq *)req
{
    NSLog(@"onReq: %@", req);
    //onReq是微信终端向第三方程序发起请求,要求第三方程序响应。第三方程序响应完后必须调用sendRsp返回。在调用sendRsp返回时,会切回到微信终端程序界面。
}

- (void)onResp:(BaseResp *)resp
{
    //如果第三方程序向微信发送了sendReq的请求,那么onResp会被回调。sendReq请求调用后,会切到微信终端程序界面。
    NSLog(@"onResp: %@", resp);
    if ([resp isKindOfClass:[SendAuthResp class]]){//用户授权后回调
        SendAuthResp * result = (SendAuthResp*)resp;
        //        ERR_OK = 0(用户同意)
        //        ERR_AUTH_DENIED = -4(用户拒绝授权)
        //        ERR_USER_CANCEL = -2(用户取消)
        if (resp.errCode == 0) {
            NSLog(@"SendAuthResp2 %@, %@", result.code, result.state);
            //1.result.code 获取code
            //2.getToken
            //3.getuserinfo
            [self getAccess_token:result.code];//2
        }else{
            //提示授权失败
        }
    }
}

-(void)getUserInfo:(NSString*)accessToken withOpenID:(NSString*)openID
{
    // https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
    NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openID];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                /*
                 {
                 city = Haidian;
                 country = CN;
                 headimgurl = "http://wx.qlogo.cn/mmopen/FrdAUicrPIibcpGzxuD0kjfnvc2klwzQ62a1brlWq1sjNfWREia6W8Cf8kNCbErowsSUcGSIltXTqrhQgPEibYakpl5EokGMibMPU/0";
                 language = "zh_CN";
                 nickname = "xxx";
                 openid = oyAaTjsDx7pl4xxxxxxx;
                 privilege =     (
                 );
                 province = Beijing;
                 sex = 1;
                 unionid = oyAaTjsxxxxxxQ42O3xxxxxxs;
                 }
                 */
                NSLog(@"getUserInfo%@", dic);     
            }
        });
        
    });
}

- (void)refreshAccess_token:(NSString*)refresh_token
{
    //refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
    //https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%@&grant_type=%@&refresh_token=REFRESH_TOKEN", kWeiXinAppKey, refresh_token];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                /*
                 {
                 "access_token":"ACCESS_TOKEN",
                 "expires_in":7200,
                 "refresh_token":"REFRESH_TOKEN",
                 "openid":"OPENID", 
                 "scope":"SCOPE" 
                 }
                 */
                NSLog(@"getAccess_token%@", dic);
                [self getUserInfo:dic[@"access_token"] withOpenID:dic[@"openid"]];
            }
        });
    });
}
-(void)getAccess_token:(NSString*)wxCode
{
    //获取access_token
//    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
    NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code", kWeiXinAppKey, kWeiXinAppSecret, wxCode];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                /*
                 "access_token" = "OezXcEiiBSKSxW0eoylIeDkHcwRLAAAf2y5ZOMFiIgZgqh8HV4X4b2OYXOM0m7M7k5eEc3U_muSNezPcRkEG_K9w9JFCgyBiFAqoX1r2bNOUGm6eouinITnE0_Y8KN-elHDlCXQIaCKJOvMGk23mcQ";
                 "expires_in" = 7200;
                 openid = "okUT8s_748U2PTAva7AePzZ98G5c";
                 "refresh_token" = "OezXcEiiBSKSxW0eoylIeDkHcwRLAAAf2y5ZOMFiIgZgqh8HV4X4b2OYXOM0m7M7T4jiwpU3RMFneEFq5-0ZM39dDw7XGhWpX6Bi1d8uir12NG1ryKpa0XuxJE7hrtT8B2KKqph-Vux_R4Ty9HAMYA";
                 scope = "snsapi_userinfo,snsapi_base";
                 */
                NSLog(@"getAccess_token%@", dic);
                [self getUserInfo:dic[@"access_token"] withOpenID:dic[@"openid"]];
            }
        });
    });
}
#pragma mark - Weibo
- (void)didReceiveWeiboRequest:(WBBaseRequest *)request
{
    NSLog(@"didReceiveWeiboRequest %@", request);
}

- (void)didReceiveWeiboResponse:(WBBaseResponse *)response
{
    NSLog(@"didReceiveWeiboResponse %@", response);
    NSString * wbtoken = nil;
    NSString * wbCurrentUserID = nil;
    NSString * wbRefreshToken = nil;
    
     if ([response isKindOfClass:WBAuthorizeResponse.class])
    {
        NSString *title = NSLocalizedString(@"认证结果", nil);
        NSString *message = [NSString stringWithFormat:@"%@: %d\nresponse.userId: %@\nresponse.accessToken: %@\n%@: %@\n%@: %@", NSLocalizedString(@"响应状态", nil), (int)response.statusCode,[(WBAuthorizeResponse *)response userID], [(WBAuthorizeResponse *)response accessToken],  NSLocalizedString(@"响应UserInfo数据", nil), response.userInfo, NSLocalizedString(@"原请求UserInfo数据", nil), response.requestUserInfo];
        
        if ((int)response.statusCode == 0) {
            //getuserinfo
            wbtoken = [(WBAuthorizeResponse *)response accessToken];
            wbCurrentUserID = [(WBAuthorizeResponse *)response userID];
            wbRefreshToken = [(WBAuthorizeResponse *)response refreshToken];
            [self getWbUserInfo:wbtoken withUid:wbCurrentUserID];//请求用户信息
        }
    }
}

- (void)getWbUserInfo:(NSString*)access_token withUid:(NSString*)uid
{
    NSString *url =[NSString stringWithFormat:@"https://api.weibo.com/2/users/show.json?access_token=%@&uid=%@", access_token, uid];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

                NSLog(@"getWbUserInfo%@", dic);
            }
        });
    });
}

#pragma mark - Tencent
- (void)tencentDidLogin
{
    NSLog(@"tencentDidLogin");
    [[NSNotificationCenter defaultCenter] postNotificationName:kLoginSuccessed object:self];
}

- (void)tencentDidNotLogin:(BOOL)cancelled
{
    //提示授权失败
}
- (void)tencentDidNotNetWork
{
    //提示网络中断
}
6.最后,调用发送授权请求,在所需要的viewController
- (IBAction)loginQq:(id)sender
{
    _oauthQQ = [[TencentOAuth alloc] initWithAppId:kTencentAppKey andDelegate:self];
    NSArray * permissions =  @[@"get_user_info", @"get_simple_userinfo", @"add_t"];
    [_oauthQQ authorize:permissions];
}

- (IBAction)loginWeixin:(id)sender
{
         SendAuthReq* req =[[SendAuthReq alloc ] init];
        req.scope = @"snsapi_userinfo,snsapi_base";
        req.state = @"fandian0722" ;
        [WXApi sendReq:req];
}

- (IBAction)loginWeibo:(id)sender;
{
    WBAuthorizeRequest *request = [WBAuthorizeRequest request];
    request.redirectURI = @"http://";
    request.scope = @"all";
    [WeiboSDK sendRequest:request];
}

7.其它 还在补充中,后续接着更新
完



© 著作权归作者所有

共有 人打赏支持
ONEPIECE_iOS
粉丝 2
博文 31
码字总数 13071
作品 0
石景山
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

React Native 【学习总结】-【Jenkins集成】

简述 Jenkins是一个持续集成工具,它本身有很丰富的插件提供使用,方便持续集成,为开发省时省力,下面是项目中对新的RN项目做的持续集成例子,通过该例子学会如何使用jenkins。 Jenkins安装...

Pape ⋅ 05/18 ⋅ 0

iOS开发专题分类大全(简书iOS学习资源大收录!)

序言 系统的整理iOS开发常用的第三方库、架构、进阶、面试学习书籍资源等,如果有更好的三方库、没有整理到、可以评论留言,我会在及时更新的,还不赶快mark~ 多看书!毕竟看一本适合自己的...

_小迷糊 ⋅ 06/08 ⋅ 0

Ionic3 应用跳转高德地图 APP

首先检测我们的 Ionic3 应用是否安装高德地图 APP,如果安装则打开该APP。 介绍 App Availability 插件 Ionic Native 官方文档提供的插件,此插件用来检查用户设备上是否已安装指定的 APP。 ...

与蟒唯舞 ⋅ 05/15 ⋅ 0

iOS开发专题分类大全(iOS学习资源大收录!)

序言 系统的整理iOS开发常用的第三方库、架构、进阶、面试学习书籍资源等,如果有更好的三方库、没有整理到、可以评论留言,我会在及时更新的,还不赶快mark~ 多看书!毕竟看一本适合自己的...

_小迷糊 ⋅ 06/08 ⋅ 0

2018 一份"有点难"的iOS面试题(5年iOS开发)

序言: 之前一时兴致在本站上出过一份iOS的中级面试题,引起一些关注,不少同学表示对”隐藏关卡“感兴趣。升级版iOS面试题来了,目测难倒90%iOS程序员,目测一大波程序员撸着袖子在靠近。 ...

原来是泽镜啊 ⋅ 05/26 ⋅ 0

iOS新特性框架、仿微信图片浏览、视频监控、爱心动画、文字适配等源码

iOS精选源码 iOS一个看电影、电视剧集合 HDCinema(http://www.code4app.com/thread-29425-1-1.html) 一个非常简易的新特性集成框架NewFeatures(http://www.code4app.com/thread-29433-1-1.ht......

sunnyaigd ⋅ 05/02 ⋅ 0

微信小程序唤起其他微信小程序 / 移动应用App唤起小程序

1. 微信小程序唤起微信小程序 小程序唤起其他小程序很简单 先上链接 小程序跳转小程序 Navigator组件 推荐使用 小程序跳转小程序 wx.navigateToMiniProgram(OBJECT) API 即将废弃 不推荐使用...

一个程序猿的每一天 ⋅ 05/30 ⋅ 0

iOS原生混合RN开发最佳实践

做过原生iOS开发或者Android开发的同学们肯定也都了解Hybrid,有一些Hybrid的开发经验,目前我们企业开发中运用最广泛的Hybrid App技术就是原生与H5 hybrid,在早期的时候,可能部分同学也接...

光强 ⋅ 05/16 ⋅ 0

全屏手势返回插件 - BBGestureBack

BBGestureBack Full screen return gesture(全屏手势返回 滑动返回 pop 动画效果) iOS 侧滑返回 BBGestureBack iOS 全屏手势返回 滑动返回 pop 动画效果 现在市场上的主流app都有用到各种侧...

Bonway ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iExec Blockchain Marketplace for Cloud

iExec Releases the First-Ever Blockchain Marketplace for Trading Cloud Computing Berlin, Germany, May 29, 2018. iExec has released its blockchain-based decentralized cloud marke......

openthings ⋅ 18分钟前 ⋅ 0

OSChina 周二乱弹 —— 加班的代码不要枉费了我的童子功

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《29》- 未完成乐队 《29》- 未完成乐队 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :#看球提醒# 02:00 巴西v...

小小编辑 ⋅ 37分钟前 ⋅ 11

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 今天 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部