独立集成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微信分享不触发回调函数onResp()解决方法

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

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

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

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

QQ SDK 分享实现,及不回调问题

很多人和我当初一样,明明实现了回调接口,但就是不回调,不知道原因在哪里。 后来发现有几个值得注意的问题: 1. AndroidManifest.xml里的那个APP_ID前,一定要有tencent ...
  • leluck
  • leluck
  • 2016-01-27 21:28
  • 4458

Android 集成ShareSDK分享QQ或空间成功后,回调却不执行的原因

AndroidMainifest.xml中的如箭头所示的id一定要与assets下ShareSDK.xml中配置的QQ的AppId一定要相同。 如下图:

ios微信和QQ原生分享

ios微信和QQ原生分享

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

QQ登录认证后会触发appDelegate 的  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sour...

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

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

ShareSDK集成微信、QQ、微博分享

1、前言 为什么要使用第三方的作为集成分享的工具呢?而不去用官方的呢?有什么区别么? 一个字”快”,如果你使用官方的得一个个集成他们的SDK,相信这是一个痛苦的过程。2、准备需要分...

ios 微信分享,QQ分享,微博分享集成

好久不跟新博客。虽然也没有几个人看。 话不多说,直插主题。现在每个应用里头都会有第三方分享,有的项目中用ShareSDK 或者 友盟社会化组件。但本宝宝做分享的时候,组长看见我用友盟分享,很不开心,...

QQ分享无法回调的问题

由于公司的项目需要,在软件中集成了QQ、微信、新浪的SDK,以实现第三方登陆以及分享。(并未使用ShareSDK或者友盟)因此,在自己集成的时候也有遇到了各种问题,其中印象最深刻的是无法执行QQ的回调...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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