iOS - 关于第三方登录的那些事(微信、QQ、新浪微博)

一.微信实现三方登录

前面一些基本的配置我这里就不赘述了,不太明白的可以去看我的关于微信分享的那篇文章,里面有比较详细的撸代码之前的前期准备工作。

1.向微信注册

// WXAPPID:在微信开放平台注册应用时分配的AppID
[WXApi registerApp:WXAPPID];

2.处理open url

- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options {
    // 设置了代理为Appdelegate
    return [WXApi handleOpenURL:url delegate:self];
}

3.微信登录

- (void)weixinLoginButtonClick {
   // 先判断是否安装微信客户端
    if ([WXApi isWXAppInstalled]) {
        SendAuthReq *req = [[SendAuthReq alloc] init];
        req.scope = @"snsapi_userinfo";
        req.state = @"App";
        [WXApi sendReq:req];
    }
    else {
        [self showAlertWithTitle:@"提示" message:@"请先下载微信客户端"];
    }
}
微信登录.png
微信授权.png

4.微信相关的回调

上面的方法执行过后就会执行如下的回调方法

- (void)onReq:(BaseReq *)req
{
     JRLog(@"调用sendResp方法后,收到来自微信的请求,发送相应的结果给微信");
}

- (void)onResp:(BaseResp *)resp
{
    if([resp isKindOfClass:[SendMessageToWXResp class]]) { 
        NSLog(@"微信分享相关的回调");
    }else if ([resp isKindOfClass:[SendAuthResp class]]) {
        SendAuthResp *temp = (SendAuthResp*)resp;
        if (temp.errCode == WXSuccess) {
            // 微信授权成功
            [self getAuthorityWithCode:temp.code];
        }
    }
}

#pragma mark --
/**
WXAPPID:在微信平台注册时的AppID
APPSECRET:在微信平台注册应用时获取
*/
- (void)getAuthorityWithCode:(NSString *)code {
    NSString *URL = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",WXAPPID,APPSECRET,code];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *baseURL = [NSURL URLWithString:URL];
        NSString *rightURL = [NSString stringWithContentsOfURL:baseURL encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [rightURL dataUsingEncoding:NSUTF8StringEncoding];
        if (data) {
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
            NSString *access_token = [dic objectForSafeKey:@"access_token"];
            NSString *openid = [dic objectForSafeKey:@"openid"];
            [self wechatLoginByRequestForUserInfoWithAccess:access_token openID:openid];
        }
    });
}

/** 获取微信用户信息*/
- (void)wechatLoginByRequestForUserInfoWithAccess:(NSString *)access_token openID:(NSString *)openid {
    // 获取用户信息
    NSString *URL = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",access_token,openid];
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager GET:URL parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
        if (dict != nil) {
            NSLog(@"dict里面即是获取到得微信的相关信息(头像 昵称等)");
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    }];
}

二.QQ实现三方登录

- (void)qqLoginButtonClick {
    if (![TencentOAuth iphoneQQInstalled]) {
        [self showAlertWithTitle:@"提示" message:@"请先下载QQ客户端"];
    }else {
        self.tencentOAuth = [[TencentOAuth alloc] initWithAppId:QQAPPID
                                                    andDelegate:self];
        NSArray *permissions= [NSArray arrayWithObjects:@"get_user_info",@"get_simple_userinfo",@"add_t",nil];
        [self.tencentOAuth authorize:permissions inSafari:NO];
    }
}
QQ登录授权.png
#pragma mark --  TencentLoginDelegate
/**
 * 登录成功后的回调
 */
- (void)tencentDidLogin {
    NSLog(@"QQ登录成功 - %@",self.tencentOAuth.openId);
}

/**
 * 登录失败后的回调
 * \param cancelled 代表用户是否主动退出登录
 */
- (void)tencentDidNotLogin:(BOOL)cancelled {
    if (!cancelled) {
        [self showAlertWithTitle:@"提示" message:@"QQ登录失败"];
    }
}

/**
 * 登录时网络有问题的回调
 */
- (void)tencentDidNotNetWork {
    [self showAlertWithTitle:@"提示" message:@"登录时网络出现错误"];
}

/**
 * 退出登录的回调
 */
- (void)tencentDidLogout {
    NSLog(@"退出登录");
}

三.新浪微博实现三方登录

1.新浪微博按钮点击

- (void)weiboLoginButtonClick {
    if (![WeiboSDK isWeiboAppInstalled]) {
        [self showAlertWithTitle:@"提示" message:@"请先安装新浪微博客户端"];
    }else {
        // 授权页面(授权页面是微博提供的 我们只需要用网页来加载它即可)
        JROAuthorViewController *oauthVc = [[JROAuthorViewController alloc] init];
        [self.navigationController pushViewController:oauthVc animated:YES];
    }
}

2.授权页面的实现

新浪微博1.png
- (void)viewDidLoad
{
    [super viewDidLoad];
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 64, [UIDevice screenWidth], [UIDevice screenHeight])];
    webView.delegate = self;
    [self.view addSubview:webView];
    self.navigationTitleLabel.text = @"新浪微博授权";
    // 2.用webView加载授权页面
    NSString *urlStr = [NSString stringWithFormat:@"https://api.weibo.com/oauth2/authorize?client_id=%@&redirect_uri=%@",WBAPPID,@"http://sns.whalecloud.com/sina2/callback"];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];
}

#pragma mark - UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *url = request.URL.absoluteString;
    // 1.是否为回调地址
    NSRange range = [url rangeOfString:@"code="];
    if (range.length != 0) {
        // 2.截取code=后面的参数值
        NSInteger fromIndex = range.location + range.length;
        NSString *code = [url substringFromIndex:fromIndex];
        // 3.利用code换取一个accessToken
        [self accessTokenWithCode:code];
    }
    return YES;
}
新浪微博2.png
/**
 *  利用授权成功后的request token换取一个accessToken
 */
- (void)accessTokenWithCode:(NSString *)code {
    // 1.请求管理者
    AFHTTPSessionManager *manager =                  [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];  
    // 2.拼接请求参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"client_id"] = WBAPPID;
    params[@"client_secret"] = WBSECRT;
    params[@"grant_type"] = @"authorization_code";
    params[@"redirect_uri"] = @"http://sns.whalecloud.com/sina2/callback";
    params[@"code"] = code;   
    // 3.发送请求
    [manager POST:@"https://api.weibo.com/oauth2/access_token" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
        if (dict != nil) {
           NSLog(@"获取access_token成功");
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
    }];
}
新浪微博3.png

总结

以上只是三方登录的简单应用,具体的应用还是各自平台的文档相当全面。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,033评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,089评论 4 62
  • 自从注册简书以来,我开始了疯狂的写作之旅。 我是一个上班族,有自己的工作,虽然工资不高,但眼下我还得靠这点工资维持...
    孤影作伴阅读 268评论 4 7
  • 参考:http://blog.csdn.net/pdcxs007/article/details/43735975...
    放风筝的小小马阅读 375评论 0 1
  • 还有菠菜花生 午加餐:紫米糕 参考目标: 1份肉2份豆制品3份“新鲜”水果4份谷物/薯5份蔬菜,深绿色叶菜最好6杯...
    静趣_儿童心理师阅读 257评论 0 0