iOS 接入QQSDK封装的工具类HHTencentSDK(QQ登录,QQ好友分享,QQ空间分享)

SDK下载

这里是QQ官方的SDK,使用文档的下载链接

添加依赖库

把下载的SDK拖进工程,在Build Phases下面的Link Binary With Libraries项中添加下面所需的依赖库:
Security.framework,
libiconv.dylib,
SystemConfiguration.framework,
CoreGraphics.Framework,
libsqlite3.dylib,
CoreTelephony.framework,
libstdc++.dylib,
libz.dylib

B9290B6F57219E8BED6DC5076EDC69E3.jpg

工程配置属性

在工程配置中的Build Settings一栏中找到Linking配置区,给Other Linker Flags配置项添加属性值:
-fobjc-arc

设置URL Scheme

修改 info.plist 文件 URL types 项中后面的URL Schemes内容为"tencent + appid",例如:tencent1234567890
(我这里设置了支付宝,qq,微信,微博,只用到QQ的话,就添加QQ的就ok)


2EA80578-7343-433E-8803-73E4E826BE11.png

添加URL Schemes白名单

在“Info.plist”中增加一个LSApplicationQueriesSchemes值,设置为array, 添加QQ和QQ空间需要的几个item(图片中我还添加了别的,只用QQ的话就填加下面这些就可以):
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqzoneopensdk

4ECDABF8-640E-4CF9-BBB8-C93037F155D9.png

然后就就可以愉快的写代码了

创建了一个继承于NSObject的HHTencentSDK工具类,我自己简单的封装了一下以往需要QQ登录和分享用到的方法,需要别的功能的话,还是要去看官方的开发文档滴.

.h文件

#import <Foundation/Foundation.h>
#import <TencentOpenAPI/TencentOAuth.h>
#import <TencentOpenAPI/QQApiInterface.h>
@interface HHTencentSDK : NSObject
/**
 实例化
 */
+(instancetype) shareInstance;

/**
 初始化
 */
-(void)initSDK;

/**
 请求调用qq登录
 */
- (void)sendQQLoginRequest;

/**
 openURL
 */
+(BOOL)handleOpenURL:(NSURL *)url;

/**
 分享到QQ好友
 
 @param title     分享的文字标题
 @param content   分享的文字内容
 @param urlStr    分享的图片URL字符串
 */
+(QQApiSendResultCode)shareToQQWithTitle:(NSString *)title
                                 Content:(NSString *)content
                             imageURLStr:(NSString *)urlStr;


/**
 分享到QQ空间
 
 @param title     分享的文字标题
 @param content   分享的文字内容
 @param urlStr    分享的图片URL字符串
 */
+(QQApiSendResultCode)shareToQZoneWithTitle:(NSString *)title
                                    Content:(NSString *)content
                                imageURLStr:(NSString *)urlStr;

@end

.m文件

#import "HHTencentSDK.h"
@interface HHTencentSDK ()<TencentSessionDelegate>
@property (strong, nonatomic)TencentOAuth *tencentOAuth;

@end


@implementation HHTencentSDK

static NSURL * safeURL(NSString * origin) {
    return [NSURL URLWithString:
            [origin stringByAddingPercentEscapesUsingEncoding:
             NSUTF8StringEncoding]];
}

static HHTencentSDK* _instance = nil;

//单例模式供外调用基类对象
+(instancetype) shareInstance{
    static dispatch_once_t onceToken ;
    dispatch_once(&onceToken, ^{
        _instance = [[super allocWithZone:NULL] init] ;
    }) ;
    
    return _instance ;
}

+(id) allocWithZone:(struct _NSZone *)zone{
    return [HHTencentSDK shareInstance] ;
}

-(id) copyWithZone:(NSZone *)zone{
    return [HHTencentSDK shareInstance] ;
}

-(id) mutablecopyWithZone:(NSZone *)zone{
    return [HHTencentSDK shareInstance] ;
}

#pragma mark - qq登录
- (void)sendQQLoginRequest{
    NSArray* permissions = [NSArray arrayWithObjects:
                            kOPEN_PERMISSION_GET_USER_INFO,
                            kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,
                            nil];
    BOOL isSuccess = [_tencentOAuth authorize:permissions inSafari:NO];
    if (isSuccess) {
        NSLog(@"QQ调用登录成功");
    }else{
        
        NSLog(@"QQ调用登录失败");
    }
}

//登录成功后的回调
- (void)tencentDidLogin {
    if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length]){
        
        BOOL isGetUserInfo = [_tencentOAuth getUserInfo];
        if (isGetUserInfo) {
            NSLog(@"获取用户QQ信息成功");
        }
    }else{
        NSLog(@"登录不成功 没有获取accesstoken");
    }
}

//获取用户信息回调
- (void)getUserInfoResponse:(APIResponse*) response{
    NSLog(@"getUserInfoResponse-%@",response.jsonResponse);
    if (response.jsonResponse==nil) {
        return;
    }
    NSDictionary *dict = response.jsonResponse;
    NSLog(@"%@",dict);
    //昵称
    NSLog(@"%@",dict[@"nickname"]);
    //性别
    NSLog(@"%@",dict[@"gender"]);
    //openID:用户授权登录后对该用户的唯一标识
    NSLog(@"%@",_tencentOAuth.openId);
    //AccessToken凭证,用于后续访问各开放接口
    NSLog(@"%@",_tencentOAuth.accessToken);
    //头像
    NSLog(@"%@",dict[@"figureurl_qq_2"]);

//获取到用户信息后根据需要保存在本地或上传到服务端,用作的用户信息
    
}

//登录失败后的回调(cancelled 代表用户是否主动退出登录)
- (void)tencentDidNotLogin:(BOOL)cancelled {
    
}

//登录时网络有问题的回调
- (void)tencentDidNotNetWork {
    
}

//初始化
-(void)initSDK{
    //appID:从腾讯那里申请的你的应用的AppID
    _tencentOAuth = [[TencentOAuth alloc] initWithAppId:QQ_AppID andDelegate:self];
}

//openURL
+(BOOL)handleOpenURL:(NSURL *)url {
    return [TencentOAuth HandleOpenURL:url];
}

//分享到QQ好友
+(QQApiSendResultCode)shareToQQWithTitle:(NSString *)title
                                 Content:(NSString *)content
                             imageURLStr:(NSString *)urlStr{
    QQApiNewsObject *newsObj = [QQApiNewsObject objectWithURL:safeURL(urlStr)
                                                        title:title
                                                  description:content
                                              previewImageURL:safeURL(urlStr)];
    
    SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];
    
    return [QQApiInterface sendReq:req];
}

//分享到QQ空间
+(QQApiSendResultCode)shareToQZoneWithTitle:(NSString *)title
                                    Content:(NSString *)content
                                imageURLStr:(NSString *)urlStr{
    QQApiNewsObject *newsObj = [QQApiNewsObject objectWithURL:safeURL(urlStr)
                                                        title:title
                                                  description:content
                                              previewImageURL:safeURL(urlStr)];
    
    SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];
    return [QQApiInterface SendReqToQZone:req];
}


@end

设置

在AppDelegate.m文件中初始化

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   //qq
    [[HHTencentSDK shareInstance] initSDK];
}

openURL方法中设置回调(这里一个是iOS9以下的系统调用的系统方法和一个是iOS9以上的系统调用的系统方法,都要设置)

#pragma mark - OpenURL回调结果
//iOS9-
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    [self handleOpenURLWithURLHost:url];
    return YES;
}
//iOS9和9+
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
    [self handleOpenURLWithURLHost:url];
    return YES;
}

- (void)handleOpenURLWithURLHost:(NSURL *)url{
 NSLog(@"url.host:%@", url.host);
       //qq(分享,登录)
    if ([url.host isEqualToString:@"response_from_qq"]||[url.host isEqualToString:@"qzapp"]){
        [HHTencentSDK handleOpenURL:url];
    }


}

调用

分享是类方法,直接调用就好

/**
 分享到QQ好友
 
 @param title     分享的文字标题
 @param content   分享的文字内容
 @param urlStr    分享的图片URL字符串
 */
+(QQApiSendResultCode)shareToQQWithTitle:(NSString *)title
                                 Content:(NSString *)content
                             imageURLStr:(NSString *)urlStr;


/**
 分享到QQ空间
 
 @param title     分享的文字标题
 @param content   分享的文字内容
 @param urlStr    分享的图片URL字符串
 */
+(QQApiSendResultCode)shareToQZoneWithTitle:(NSString *)title
                                    Content:(NSString *)content
                                imageURLStr:(NSString *)urlStr;

登录需要先实例化再调用以下接口

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

推荐阅读更多精彩内容