独立集成QQ和微信分享的回调冲突问题

原创 2016年08月30日 10:15:05

QQ登录认证后会触发appDelegate 的 

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

QQ分享后,微信登录成功,微信分享成功后均会触发该方法。

问题一:如何区分到底是QQ登录回调还是QQ分享回调,因为在该方法中他们两个操作需要处理的事件不一样,而微信则是统一的处理就不存在该问题。

问题二:QQ分享和微信分享后均会触发其协议方法(首先appDelegate需要分别遵守微信和QQ的那两个协议 WXApiDelegate,QQApiInterfaceDelegate),然而这两个协议中对于分享成功或者失败的回调用的协议方法是一样的,微信的是  -(void) onResp:(BaseResp*)resp,而QQ的是- (void)onResp:(QQBaseResp *)resp   方法名一模一样,仅仅是参数类型不一样,怎么处理。

对于问题一:我们暂且不管它是由登录还是分享完成引起的回调

if ([url.description hasPrefix:tencentUrlPrefix]){

[QQApiInterface handleOpenURL:url delegate:self];

if (YES == [TencentOAuth CanHandleOpenURL:url]) {

return [TencentOAuth HandleOpenURL:url];

}

return YES;

}

我们都去响应他的回调,具体是那种我们可以根据其resp的类型来判定。

if ([resp isKindOfClass:[SendMessageToQQResp class]]) {

SendMessageToQQResp * tmpResp = (SendMessageToQQResp *)resp;

if (tmpResp.type == ESENDMESSAGETOQQRESPTYPE && [tmpResp.result integerValue] == 0) {

[[NSNotificationCenter defaultCenter] postNotificationName:@"shareToQQResponseNotification" object:nil];

}

}

上面的代码即表示为QQ分享且分享成功时我们向外发一个通知,然后在具体分享页面处理该通知。


问题二:因为QQ与微信的回调协议方法名称一直,仅仅是参数类型不一样,在OBJC中大部分的方法调用都是通过消息转发机制实现的,我们可以把它改装成一个通用方法

-(void)onResp:(id)resp;

然后不管是QQ还是微信在分享完成后均会发出方法名为onResp的消息,我们只需要在该通用方法中根据传入的resp类型就可以判定到底是微信还是QQ的分享回调了。

-(void)onResp:(id)resp{

//Wechat分享返回

if ([resp isKindOfClass:[SendMessageToWXResp class]]) {

SendMessageToWXResp * tmpResp = (SendMessageToWXResp *)resp;

if (tmpResp.errCode == WXSuccess) {

SBDebugLog(@"分享至微信成功!");

[[NSNotificationCenter defaultCenter] postNotificationName:@"shareToWechatResponseNotification" object:nil];

}else{

SBDebugLog(@"分享至微信失败!");

}

}

//QQ分享返回

if ([resp isKindOfClass:[SendMessageToQQResp class]]) {

SendMessageToQQResp * tmpResp = (SendMessageToQQResp *)resp;

if (tmpResp.type == ESENDMESSAGETOQQRESPTYPE && [tmpResp.result integerValue] == 0) {

[[NSNotificationCenter defaultCenter] postNotificationName:@"shareToQQResponseNotification" object:nil];

}

}

}

另外吐槽以下,腾讯写QQ和微信API的应该是同一个人吧,风格如此一致,然后SDKDemo愣是找不到,SDK说明就跟一坨屎一样。可以学学GOOGLE的SDK说明,真是一个天上一个地下。



也可以参考如下的方案:


一、前言:微信和QQ的回调方法名相同

-(void) onReq:(BaseReq*)req

- (void)onResp:(QQBaseResp *)resp

所以在AppDelegate中会冲突。

二、正文:

1、原本我是这样写的:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

 if ([string hasPrefix:kWXKey]){

     return [WXApi handleOpenURL:url delegate:self];

}else if ([string hasPrefix:kQQkey"]){ 

     return [QQApiInterface handleOpenURL:url delegate:self];

}

但是,他们的回调都是相同的方法名:

1、微信回调:

/*! @brief 发送一个sendReq后,收到微信的回应  *

* 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。

* 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。

* @param resp具体的回应内容,是自动释放的

*/

-(void) onResp:(BaseResp*)resp;

2、QQ回调:

/** 处理来至QQ的请求 */

- (void)onReq:(QQBaseReq *)req;

他们在AppDelegate里名字是冲突的,所以,不能以AppDelegate为代理处理,

最后,我为微信和QQ分享,单独写一个分享Tool,并把相应的代理方法写在Tool中.

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

if ([string hasPrefix:kWXKey]){

     WeixinSDKTool *wx = [[WeixinSDKTool alloc]init];

     return [WXApi handleOpenURL:url delegate:wx];

} else if ([string hasPrefix:kQQKey]){

      QQSDKTool * qq = [[QQSDKTool alloc]init];

      return [QQApiInterface handleOpenURL:url delegate:qq];

}


附:

1、微信Tool.h

#import <Foundation/Foundation.h>

#import "WXApi.h"

#import "WXApiObject.h"

@interface WeixinSDKTool : NSObject<WXApiDelegate>

typedef NS_ENUM(NSInteger, WXSceneType) {

WXSceneTypeSession  = 0,        /**< 聊天界面    */

WXSceneTypeTimeline = 1,        /**< 朋友圈      */

WXSceneTypeFavorite = 2,        /**< 收藏      */

};

+ (void) sendImageContent:(UIImage *)image scene:(WXSceneType)scene;

@end

2、QQTool.h

#import<UIKit/UIKit.h>

#import<Foundation/Foundation.h>

#import<TencentOpenAPI/QQApi.h>

#import<TencentOpenAPI/QQApiInterface.h>

@interface QQSDKTool : NSObject<QQApiInterfaceDelegate>

+ (void)shareToWeiboWithImage:(UIImage *)image title:(NSString *)title description:(NSString *)description;

@end

nice~




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

QQ分享无法回调的问题

由于公司的项目需要,在软件中集成了QQ、微信、新浪的SDK,以实现第三方登陆以及分享。(并未使用ShareSDK或者友盟)因此,在自己集成的时候也有遇到了各种问题,其中印象最深刻的是无法执行QQ的回调...

iOS微信分享不触发回调函数onResp()解决方法

iOS微信分享不触发回调函数onResp()解决方法此问题最近困扰了我三天,检查项目代码与网上方法对照,并没有发现不对的地方,跟断点调试,只发现微信分享后微信端并没有给应用反馈,onResp()没有触...
  • czis912
  • czis912
  • 2017年03月10日 11:20
  • 3171

微信分享实现及成功回调注意事项(一)

最近需要做一个微信分享的功能,琢磨了两天终于算是弄明白了,心里有点小高兴,记录下来供后人参考,少走弯路。 实现功能: 一、Android项目中集成微信开放平台SDK库文件 二、 实现微信分享功能...

sharesdk 微信登陆分享点击留在微信回调解决方案

sharesdk微信分享后点击“留在微信”无法执行回调的处理方法。
  • chniccs
  • chniccs
  • 2016年02月01日 11:23
  • 8839

iOS开发 微信SDK的分享功能

1.首先下载微信SDK:微信SDK下载地址(更多关于微信SDK信息文档请访问官方网站:微信开放平台) 2.导入微信SDK 将下载下来的SDKExport文件夹导入到工程,其中包含3个核心文件libW...

解决QQ分享没有收到【成功回调】的问题

写在前面的话:一个做了两遍的QQ分享,再次做的时候,直接边拷贝边修改,运行后发现没问题。但是:分享成功却收不到成功的回调。解决办法:首先请点击这里,一个字一个字的对照着看看自己那里跟文档写的不一样,重...

iOS开发之第三方分享QQ分享,史上最新最全第三方分享QQ方式实现

本文章源码地址: https://github.com/zhonggaorong/QQLoginDemo 项目搭建参考:  (包含QQ登录源码下载 、 QQ sdk集成) http://b...

ShareSDK微信支付成功不调用onResp、openURL、handleOpenURL等方法

ShareSDK最新的是3.x版本,以前老的2.x需要更新,可能出现的问题:微信支付成功不调用onResp、openURL、handleOpenURL等方法...

iOS集成微信支付问题, 友盟SDK有干扰或者说是冲突的解决

—— 项目中遇到的问题 原因描述: 由于前期的app开发由外包完成, 所以并不清楚项目中用的友盟SDK的版本. 导致在集成微信支付时, 调起微信app并没有反应, 或者说是调起失败. 解决办法:...

ios 单独集成qq和微信分享sdk的方法

最近在做qq和微信分享,中途遇到好多问题,但是网上没有太多的单独集成的文章,只能自己一步一步摸索,所以,有必要记下来,希望大家能够少绕弯路. 微信分享: 在项目中添加微信的sdk之后需要进行如下操作:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:独立集成QQ和微信分享的回调冲突问题
举报原因:
原因补充:

(最多只允许输入30个字)