独立集成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~




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

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

最近在做qq和微信分享,中途遇到好多问题,但是网上没有太多的单独集成的文章,只能自己一步一步摸索,所以,有必要记下来,希望大家能够少绕弯路. 微信分享: 在项目中添加微信的sdk之后需要进行如下操作:...
  • Scott_cc
  • Scott_cc
  • 2016年01月14日 11:20
  • 4095

iOS开发集成第三方微信支付和分享问题

前言 直入主题 有关微信支付问题 在这里就不再介绍有关微信支付申请的流程了,小白可以参看微信开放平台和微信服务号也可申请微信支付接口。这里是微信官方给的微信支付接入指南(然而并没有太大用...
  • jiang314
  • jiang314
  • 2016年08月29日 20:17
  • 3222

IOS 微信分享和QQ分享的总结

最近因为项目需要,要集合微信分享和QQ分享功能,在实现的过程中,发现各种坑,特别是QQ分享,文档看了N多个,整合N多次,最后终于弄出来了。网上版本太多,需要开发人员一一去辨别,我整理了一下,主要是关于...
  • lixiang044
  • lixiang044
  • 2017年07月14日 11:36
  • 93

android 微信 以及QQ的SDK接入分享功能遇到的些问题小结

首先是微信分享:  微信分享做的不是很好,给别人的测试和开发带来了很大的不便、 1 : 确定你的Apk包名和签名是否与开放平台填写的一致,尤其签名,必须保持一致,否则不能启动微信客户端; 2: 你的s...
  • zs20082012
  • zs20082012
  • 2016年11月16日 10:31
  • 1194

iOS-微信分享成功回调问题

本人用ShareSDK做分享和第三方登录,登录先不讲,本节只做分享成功或失败后回调问题。相信好多人会有这个疑惑就是在微信分享成功后没有成功后的方法回调,我在ShareSDK论坛也发表过帖子问过,Sha...
  • SSY_1992
  • SSY_1992
  • 2017年12月15日 11:50
  • 2914

解决集成微信第三方登录和分享回调的冲突

这几天做项目需要加入源生的微信登录和分享,我是先做的登录功能,在WXEntryActivity处理登录后的回调,写了很多逻辑,包括拿用户信息,上传到服务器等,过了几天做微信分享,发现每次分享完成后点击...
  • dl10210950
  • dl10210950
  • 2016年10月27日 08:39
  • 3391

iOS 关于友盟微信分享成功回调不走的问题

不得不说,友盟的客服以及论坛服务很不周到,特别是最近要获取友盟微信分享是否成功的状态,在分享回调里根本拿不到,回调根本不走。于是查看友盟论坛,提问的人很多,解答的完全没有,再咨询在线客服,回复答不到点...
  • txz_gray
  • txz_gray
  • 2017年06月21日 11:44
  • 3298

Android集成友盟社会化分享功能----关键在微信分享(MD5的处理)

B8:DB:FB:89:F0:F0:FC:7A:DB:10:D7:B4:AB:D6:06:13 b8dBfB89f0f0fc7adb10d7b4abd60613
  • u014539465
  • u014539465
  • 2015年07月30日 09:01
  • 1417

友盟分享 微信分享没有回调信息

微信分享没有回调信息 问题:分享成功,取消,失败没有提示信息 不知道现在还有没有用友盟微信分享遇到问题的,如果有,希望这里的内容能帮到你。其实友盟官网已经说得很清楚了, 只不过我很多人有时候直接b...
  • hzx929518714
  • hzx929518714
  • 2016年12月31日 17:21
  • 2422

android中微信、朋友圈分享无回调的问题

如果在您的项目中集成了微信或者微信朋友圈,并且您需要准确的分享回调,则需要在AndroidManifest.xml中下注册下面的回调Activity。...
  • zung435
  • zung435
  • 2016年04月26日 16:01
  • 1789
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:独立集成QQ和微信分享的回调冲突问题
举报原因:
原因补充:

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