废话不多说,直接上干货!
以下所有的QQ授权登录都简称QQ登录,所有的微信授权登录简称微信登录
第一步:不管是QQ登录还是微信登录,先让产品同事去开放平台申请APP ID和APP密钥;
第二步:下载SDK
1、QQ登录(只能从开放平台下载SDK)
http://wiki.open.qq.com/wiki/mobile/SDK下载
2、微信登录(可以从开放平台下载SDK,也可以通过cocoapods下载安装)
2.1、直接从开放平台下载SDK
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN
2.2、在Podfile中添加:pod ‘WechatOpenSDK’
第三步:添加头文件
#import <TencentOpenAPI/QQApiInterface.h>
#import <TencentOpenAPI/TencentOAuth.h>
#import <WXApi.h>
#import <WechatAuthSDK.h>
第四步:开始写ThirdLogin封装(以下封装主要是实现登录和获取用户信息)
头文件
@interface ThirdLogin : NSObject
@property (nonatomic, copy) void (^QQOpenID)(NSString *qqOpenId);
@property (nonatomic, copy) void (^WXOpenID)(NSString *wxOpenId);
@property (nonatomic, copy) void (^QQUserInfo)(NSDictionary *qqUserInfo);
@property (nonatomic, copy) void (^WXUserInfo)(NSDictionary *wxUserInfo);
// 获取模块单例
+ (ThirdLogin *)shareInstance;
#pragma mark - QQ登录
// 拉起QQ登录UI
- (void)qqLogin;
#pragma mark - 微信登录
// 注册微信登录
- (void)wxLoginRegister;
// 拉起微信登录UI
- (void)wxLogin;
// 获取微信访问令牌
- (void)getWeixinOpenId:(NSString *)code;
@end
实现文件
#import "ThirdLogin.h"
@interface ThirdLogin () <QQApiInterfaceDelegate, TencentSessionDelegate, WXApiDelegate>
@property (nonatomic, strong) TencentOAuth *tencentOAuth;
@end
@implementation ThirdLogin
// 获取模块单例
+ (ThirdLogin *)shareInstance {
static ThirdLogin *instance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
instance = [[ThirdLogin alloc] init];
});
return instance;
}
#pragma mark - QQ登录
// 拉起QQ登录UI
- (void)qqLogin {
self.tencentOAuth = [[TencentOAuth alloc] initWithAppId:QQLOGIN_APPID andDelegate:self];
NSArray *permissions = @[kOPEN_PERMISSION_GET_USER_INFO,
kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,
kOPEN_PERMISSION_ADD_ALBUM,
kOPEN_PERMISSION_ADD_ONE_BLOG,
kOPEN_PERMISSION_ADD_SHARE,
kOPEN_PERMISSION_ADD_TOPIC,
kOPEN_PERMISSION_CHECK_PAGE_FANS,
kOPEN_PERMISSION_GET_INFO,
kOPEN_PERMISSION_GET_OTHER_INFO,
kOPEN_PERMISSION_LIST_ALBUM,
kOPEN_PERMISSION_UPLOAD_PIC,
kOPEN_PERMISSION_GET_VIP_INFO,
kOPEN_PERMISSION_GET_VIP_RICH_INFO];
[self.tencentOAuth authorize:permissions];
}
// 授权成功
- (void)tencentDidLogin {
if (self.tencentOAuth.accessToken && self.tencentOAuth.accessToken.length > 0) {
if (self.QQOpenID) {
self.QQOpenID(self.tencentOAuth.openId);
}
// 获取用户信息
[self.tencentOAuth getUserInfo];
}
}
// 授权失败
- (void)tencentDidNotLogin:(BOOL)cancelled {
}
// 无网络
- (void)tencentDidNotNetWork {
}
// 获取用户信息成功
- (void)getUserInfoResponse:(APIResponse *)response {
if (self.QQUserInfo) {
self.QQUserInfo(response.jsonResponse);
}
}
- (void)isOnlineResponse:(NSDictionary *)response {
}
- (void)onReq:(QQBaseReq *)req {
}
- (void)onResp:(QQBaseResp *)resp {
}
#pragma mark - 微信登录
// 注册微信登录
- (void)wxLoginRegister {
[WXApi registerApp:WXLOGIN_APPID];
}
// 拉起微信登录UI
- (void)wxLogin {
if ([WXApi isWXAppInstalled]) {
SendAuthReq *req = [[SendAuthReq alloc] init];
req.scope = @"snsapi_userinfo";
req.state = @"XXXXXXXX";
[WXApi sendReq:req];
} else {
[SVProgressHUD showErrorWithStatus:@"您的设备未安装微信"];
}
}
// 获取微信访问令牌
- (void)getWeixinOpenId:(NSString *)code {
NSString *url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code", WXLOGIN_APPID, WXLOGIN_APPSERECET, code];
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];
if (self.WXOpenID) {
self.WXOpenID(dic[@"openid"]);
}
[self requestUserInfoByToken:dic[@"access_token"] andOpenid:dic[@"openid"]];
}
});
});
}
// 通过令牌请求微信用户信息
- (void)requestUserInfoByToken:(NSString *)token andOpenid:(NSString *)openID {
NSString *url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@", token, openID];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:url parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
if (self.WXUserInfo) {
self.WXUserInfo(dic);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[SVProgressHUD showSuccessWithStatus:error.description];
}];
}
@end
第五步:调用
QQ登录
[[ThirdLogin shareInstance] qqLogin];
[[ThirdLogin shareInstance] setQQOpenID:^(NSString * _Nonnull qqOpenId) {
[SVProgressHUD showSuccessWithStatus:qqOpenId];
}];
[[ThirdLogin shareInstance] setQQUserInfo:^(NSDictionary * _Nonnull qqUserInfo) {
[SVProgressHUD showSuccessWithStatus:qqUserInfo[@"nickname"]];
}];
微信登录
[[ThirdLogin shareInstance] wxLogin];
[[ThirdLogin shareInstance] setWXOpenID:^(NSString * _Nonnull wxOpenId) {
[SVProgressHUD showSuccessWithStatus:wxOpenId];
}];
[[ThirdLogin shareInstance] setWXUserInfo:^(NSDictionary * _Nonnull wxUserInfo) {
[SVProgressHUD showSuccessWithStatus:wxUserInfo[@"nickname"]];
}];
第六步:做到这里很多人都觉得完成了,可是为什么还是调不起来呢?
别急,程序媛姐姐告诉你,还有几个非常重要的配置需要去做!
第七步:注意,还没有完!进入AppDelegate
1、添加协议<QQApiInterfaceDelegate, WXApiDelegate>
2、在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中为微信登录注册
[[ThirdLogin shareInstance] wxLoginRegister];
3、遵守协议方法- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
if ([url.absoluteString containsString:QQLOGIN_APPID]) {
[QQApiInterface handleOpenURL:url delegate:self];
return [TencentOAuth HandleOpenURL:url];
}
if ([url.absoluteString containsString:WXLOGIN_APPID]) {
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
走到这里QQ登录基本上算是完成了,但是微信登录还有一个坑爹的操作,微信登录必须在AppDelegate里实现下面这个协议方法
- (void)onResp:(BaseReq *)resp {
if([resp isKindOfClass:[SendAuthResp class]]) {
SendAuthResp *authResp = (SendAuthResp *)resp;
if (![authResp.state isEqualToString:@"XXXXXXXX"]) {
[SVProgressHUD showErrorWithStatus:@"微信授权失败"];
return;
}
switch (authResp.errCode) {
case WXSuccess:
[[ThirdLogin shareInstance] getWeixinOpenId:authResp.code];
break;
case WXErrCodeUserCancel:
[SVProgressHUD showErrorWithStatus:@"微信授权取消"];
break;
default:
[SVProgressHUD showErrorWithStatus:@"微信授权失败"];
break;
}
}
}
大功告成!!!
写在文末:从第一次更新之后,姐姐我就把更多的重心置于家庭,现在姐姐又复出了,以后你们会经常看到我的哟。。。