iOS接入QQSDK实现分享的一点经验

QQ分享SDK的接入(iOS端)

一.准备工作

  • 1.在腾讯开放平台申请分享需要使用的APPID。

  • 2.在腾讯开放平台下载官方最新版本的SDK。(官方可能会改接口)

  • 3.在腾讯开放平台下载官方接入文档和API文档(虽然写的不好,但仍然有参考价值)。

  • 4.0按照官方接入文档,接入SDK的.a和.framework包。

  • 4.1如果是使用Cocoapod进行的第三方库接入,需要对接入位置的.podspec文件进行以下修改,也可以参看文档《使用CocoaPods打包framework,并创建framework的私有podspec》

     sh.vendored_frameworks = "Pod/Classes/Share/**/*.framework"
    
  • 5.接入官方要求的SDK依赖系统库文件。(具体要求见接入文档)

二.环境配置

* 下面的操作全部在工程当中

* 1.向腾讯注册本App。

  • 1.1 (2种方法)在AppDelegate.m中的didFinishLaunchingWithOptions向腾讯注册。

      [[TencentOAuth alloc] initWithAppId:QQKey andDelegate:nil]; 
    
  • 1.2 也可以在具体实现的位置,使用

      self.tencentOAuth = [[TencentOAuth alloc] initWithAppId:APPID andDelegate:self]; 
    

    注意,self使用的代理为TencentSessionDelegate,请注意引入头文件

  • 1.3在工程的buildSetting中的URLtype进行腾讯的设置,URLschemes=tencent+appid.

  • 1.4参看iOS单独集成QQ分享功能的苦逼经验
    可以帮助理解上面的操作。

* 2.使用handleOpenURL和openURL识别当前接入的是哪个第三方APP。

  • 2.1重写APPDelegate的handleOpenURL方法。如果有其他分享方式需要先判断URL是否等于tencent+APPID,如果相等,添加下面语句:

       return [TencentOAuth HandleOpenURL:url]; 
    
  • 2.2重写APPDelegate的openURL方法。同样如果有其他分享方式需要先判断URL是否等于tencent+APPID,如果相等,添加下面语句:

       return [TencentOAuth HandleOpenURL:url]; 
    
  • 2.3在文档的plist中添加QQ专用的白名单,具体白名单可以在SDK提供的demo里面拖。

* 3.设置Bundle display name属性值

  • 3.1如果创建工程是Xcode 6.0以上版本,创建工程时默认不设置Bundle display name属性值。但是QQSDK需要用到Bundle display name的值,所以务必请检查确保这个属性存在,如果没有请添加上。可以设置成与Bundle name一致。

三.实现分享的API接口调用

* 1.在实现的类中添加头文件

  • 1.1注意,QQ添加头文件时使用下面格式,要在引用的类前面添加TencentOpenAPI

       #import  <TencentOpenAPI/QQApi.h> 
    

* 2.以新闻类分享为例,给出代码参考,其他类型具体分享代码参看官方API文档

//申请一个新闻类对象
QQApiNewsObject *msgContentObj = 
[QQApiNewsObject objectWithURL:  _shareURL 
                 title:_shareTitle 
                 description:_shareDescription        
                 previewImageData:imageData];
                 
//从contentObj中传入数据,生成一个QQReq
SendMessageToQQReq *req = [SendMessageToQQReq 
                           reqWithContent:contentObj];
                           
//向QQ发送消息,查看是否可以发送
QQApiSendResultCode sent = [QQApiInterface sendReq:req];

3.QQ消息的回调

  • 2.1注意,sendReq取到的值只能在判断发送前的状态,不能判断是否放弃发送或者发送成功。判断放弃发送的方法是截取openURL中的URL,发送失败的URL含有一个叫error_description的字段,当字段中的内容为dGhlIHVzZXIgZ2l2ZSB1cCB0aGUgY3VycmVudCBvcGVyYXRpb24=时,表示用户放弃了发送,可以以此来判断当前回调情况。

  • 2.2由于QQ和微信都是腾讯的,所以有两个回调方法是相同的onReq,onResp(本文中使用的不是这个方法),为了避免产生问题,可以在声明代理的位置使用下面方法进行区别。

       [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];
    

四.iPhone4S的兼容

1.iPhone4S不兼容的原因是新版本的SDK不再支持i386,解决方法是不直接调用QQSDK中提供的接口。

2.不含参数、含有1个参数、含有2个参数的方法

  • 2.1使用NSClassFromString调用不含参的方法:

      [NSClassFromString(@"WBImageObject") 
      performSelector:NSSelectorFromString(@"object")]
    
  • 2.2使用NSClassFromString调用含一个参数的方法:

      [NSClassFromString(@"TencentOAuth")   
      performSelector:NSSelectorFromString(@"HandleOpenURL:")
       withObject:url]
    
  • 2.2使用NSClassFromString调用含两个参数的方法:

      [tencent 
      performSelector:NSSelectorFromString(@"initWithAppId:andDelegate:")
      withObject:qqString 
      withObject:(id<TencentSessionDelegate>)self];
    

3.含有大于等于3个参数的方法

  • 3.1定义多参数动态加载方法,假设叫MethodQQ

      这里涉及到公司代码,就不给例子了,
    

说明一下使用的原理是NSMethodSignature和NSInvocation的消息转发,
封装QQ的方法,调用后把参数转发给QQ的Api,执行后再传回来。

关于NSMethodSignature和NSInvocation的使用,可以参考一下这篇文章NSMethodSignature和NSInvocation使用

  • 3.2如果存在两次释放的问题,则在调用位置使用下面格式的代码,使得msgContentObj不能自动release.如果没有这个问题,不需要修改。

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

推荐阅读更多精彩内容