官方原始碼
#import "WxMsgPreview.h"
%hook CMessageMgr
-(void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap {
%log;
%orig;
if(msgWrap.m_uiMessageType == 49){
CContactMgr *contactManager = [[%c(MMServiceCenter) defaultCenter] getService:[%c(CContactMgr) class]];
CContact *selfContact = [contactManager getSelfContact];
if ([msgWrap.m_nsContent rangeOfString:@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao"].location != NSNotFound) { // 紅包
NSString *nativeUrl = [[msgWrap m_oWCPayInfoItem] m_c2cNativeUrl];
nativeUrl = [nativeUrl substringFromIndex:[@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao?" length]];
NSDictionary *nativeUrlDict = [%c(WCBizUtil) dictionaryWithDecodedComponets:nativeUrl separator:@"&"];
NSMutableDictionary *args = [[%c(NSMutableDictionary) alloc] init];
[args setObject:nativeUrlDict[@"msgtype"] forKey:@"msgType"];
[args setObject:nativeUrlDict[@"sendid"] forKey:@"sendId"];
[args setObject:nativeUrlDict[@"channelid"] forKey:@"channelId"];
[args setObject:[selfContact getContactDisplayName] forKey:@"nickName"];
[args setObject:[selfContact m_nsHeadImgUrl] forKey:@"headImg"];
[args setObject:nativeUrl forKey:@"nativeUrl"];
[args setObject:msgWrap.m_nsFromUsr forKey:@"sessionUserName"];
[[[%c(MMServiceCenter) defaultCenter] getService:[%c(WCRedEnvelopesLogicMgr) class]] OpenRedEnvelopesRequest:args];
}
}
}
%end
使用block 進行封裝
- (void)AsyncOnAddMsg:(NSString *)fromUser MsgWrap:(CMessageWrap *)wrap {
%orig;
NSLog(@"m_nsContent:%@", wrap.m_nsContent);
NSLog(@"wrap.m_uiMessageType:%ld",(long)wrap.m_uiMessageType);
switch(wrap.m_uiMessageType) {
//見下面程式碼
}
}
case 49: { // AppNode
//判斷是否為連結加群訊息
if ([wrap.m_nsContent containsString:@"邀請你加入群聊"]) {
NSLog(@"判斷是為連結加群訊息");
isEnterGroupChatMsg = YES;
id MainFrameLogic = [objc_getClass("MainFrameLogicController") new];
id NewMainFrame = [objc_getClass("NewMainFrameViewController") new];
CContactMgr *contactManager = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CContactMgr") class]];
CContact *contact = [contactManager getContactByName:wrap.m_nsFromUsr];
//頁面跳轉
id data = objc_msgSend(MainFrameLogic, @selector(getSessionInfoByContact:), contact);
objc_msgSend(NewMainFrame, @selector(openMessageContentView:startSendMessage:msgWrapToAdd:animated:jumpToFirstUnreadNode:indexPath:), data, NO, NULL, YES, NO, NULL);
}
/** 是否為紅包訊息 */
BOOL (^isRedEnvelopMessage)() = ^BOOL() {
return [wrap.m_nsContent rangeOfString:@"wxpay://"].location != NSNotFound;
};
if (isRedEnvelopMessage()) { // 紅包
isEnterGroupChatMsg = NO;
CContactMgr *contactManager = [[%c(MMServiceCenter) defaultCenter] getService:[%c(CContactMgr) class]];
CContact *selfContact = [contactManager getSelfContact];
/** 是否自己給自己發訊息 */
BOOL (^isSender)() = ^BOOL() {
return [wrap.m_nsFromUsr isEqualToString:selfContact.m_nsUsrName];
};
/** 是否自己在群聊中發訊息 */
BOOL (^isGroupSender)() = ^BOOL() {
return isSender() && [wrap.m_nsToUsr rangeOfString:@"chatroom"].location != NSNotFound;
};
/** 是否自動搶紅包 */
BOOL (^shouldReceiveRedEnvelop)() = ^BOOL() {
return YES;
};
NSDictionary *(^parseNativeUrl)(NSString *nativeUrl) = ^(NSString *nativeUrl) {
nativeUrl = [nativeUrl substringFromIndex:[@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao?" length]];
return [%c(WCBizUtil) dictionaryWithDecodedComponets:nativeUrl separator:@"&"];
};
/** 獲取服務端驗證引數 */
void (^queryRedEnvelopesReqeust)(NSDictionary *nativeUrlDict) = ^(NSDictionary *nativeUrlDict) {
NSMutableDictionary *params = [@{} mutableCopy];
params[@"agreeDuty"] = @"0";
params[@"channelId"] = [nativeUrlDict stringForKey:@"channelid"];
params[@"inWay"] = @"0";
params[@"msgType"] = [nativeUrlDict stringForKey:@"msgtype"];
params[@"nativeUrl"] = [[wrap m_oWCPayInfoItem] m_c2cNativeUrl];
params[@"sendId"] = [nativeUrlDict stringForKey:@"sendid"];
NSLog(@"搶紅包了");
//搶紅包的方法
WCRedEnvelopesLogicMgr *logicMgr = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("WCRedEnvelopesLogicMgr") class]];
[logicMgr ReceiverQueryRedEnvelopesRequest:params];
};
/** 儲存引數 */
void (^enqueueParam)(NSDictionary *nativeUrlDict) = ^(NSDictionary *nativeUrlDict) {
WeChatRedEnvelopParam *mgrParams = [[WeChatRedEnvelopParam alloc] init];
mgrParams.msgType = [nativeUrlDict stringForKey:@"msgtype"];
mgrParams.sendId = [nativeUrlDict stringForKey:@"sendid"];
mgrParams.channelId = [nativeUrlDict stringForKey:@"channelid"];
mgrParams.nickName = [selfContact getContactDisplayName];
mgrParams.headImg = [selfContact m_nsHeadImgUrl];
mgrParams.nativeUrl = [[wrap m_oWCPayInfoItem] m_c2cNativeUrl];
mgrParams.sessionUserName = isGroupSender() ? wrap.m_nsToUsr : wrap.m_nsFromUsr;
mgrParams.sign = [nativeUrlDict stringForKey:@"sign"];
mgrParams.isGroupSender = isGroupSender();
[[WBRedEnvelopParamQueue sharedQueue] enqueue:mgrParams];
};
/** */
if (shouldReceiveRedEnvelop()) {
NSString *nativeUrl = [[wrap m_oWCPayInfoItem] m_c2cNativeUrl];
NSDictionary *nativeUrlDict = parseNativeUrl(nativeUrl);
queryRedEnvelopesReqeust(nativeUrlDict);
enqueueParam(nativeUrlDict);
}
}
break;
}