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

本文探讨了在集成QQ和微信分享时遇到的回调冲突问题。主要涉及如何区分QQ登录与分享回调,以及处理QQ和微信协议方法名称相同导致的冲突。解决方案包括在AppDelegate中判断URL前缀来分发处理,并创建单独的分享工具类来作为不同平台的回调代理。

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~




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值