关于微信RE相关的所有文章,如果没有特别说明,全部基于【TKkk-iOSer/WeChatPlugin-MacOS】项目为基础开发的。
在此,由衷感谢TK.

为了尽快找到突破口,我们事先发起一个添加好友的请求给当前微信。在微信中就可以看到消息红点,同事出现了【新的朋友】。此时,我们通过xcode的【debug view hierarchy】debug微信。从视图中可以看到这一层应该为MMContactsViewController

图1 xcode debug视图

图2 xcode 拖动旋转及视图树状图

找到突破口之后,我们通过反编译利器【Hooper Disassembler】打开微信应用,等待反编译结束之后,查询MMContactsViewControllerclass,浏览其方法,可以看到有一个friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:,点击方法,进入汇编代码中,我们根据名称猜测一下,这或许就是添加好友的请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101


; ================ B E G I N N I N G O F P R O C E D U R E ================

; Variables:
; var_28: -40
; var_30: -48


-[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]:
00000001004c7fed push rbp ; Objective C Implementation defined at 0x101dfd5a8 (instance method), DATA XREF=0x101dfd5a8
00000001004c7fee mov rbp, rsp
00000001004c7ff1 push r15
00000001004c7ff3 push r14
00000001004c7ff5 push r12
00000001004c7ff7 push rbx
00000001004c7ff8 sub rsp, 0x10
00000001004c7ffc mov r15d, r8d
00000001004c7fff mov r12, rcx
00000001004c8002 mov r14, rdi
00000001004c8005 mov rdi, qword [objc_cls_ref_NSString] ; argument "instance" for method _objc_msgSend
00000001004c800c mov rsi, qword [0x101f8b548] ; @selector(alloc), argument "selector" for method _objc_msgSend
00000001004c8013 call qword [_objc_msgSend_101c06d08] ; _objc_msgSend
00000001004c8019 mov rcx, rax
00000001004c801c movsx r8d, r15b
00000001004c8020 mov rsi, qword [0x101f8b848] ; @selector(initWithFormat:), argument "selector" for method _objc_msgSend
00000001004c8027 lea rdx, qword [cfstring_INFO__contactsvc_didChangeFriendRequestUnreadCount___lu___d] ; @"INFO: contactsvc didChangeFriendRequestUnreadCount: %lu, %d"
00000001004c802e xor eax, eax
00000001004c8030 mov rdi, rcx ; argument "instance" for method _objc_msgSend
00000001004c8033 mov rcx, r12
00000001004c8036 call qword [_objc_msgSend_101c06d08] ; _objc_msgSend
00000001004c803c mov rbx, rax
00000001004c803f mov rdi, qword [objc_cls_ref_MMLogger] ; argument "instance" for method _objc_msgSend
00000001004c8046 mov rsi, qword [0x101f8b850] ; @selector(logWithMMLogLevel:module:file:line:func:message:)
00000001004c804d mov qword [rsp+0x30+var_28], rbx
00000001004c8052 lea rax, qword [0x101a48845] ; "-[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]"
00000001004c8059 mov qword [rsp+0x30+var_30], rax
00000001004c805d lea rcx, qword [0x101a4843b] ; "ContactUI"
00000001004c8064 lea r8, qword [0x101a482fd]
00000001004c806b mov edx, 0x4
00000001004c8070 mov r9d, 0x210
00000001004c8076 call qword [_objc_msgSend_101c06d08] ; _objc_msgSend
00000001004c807c mov rdi, rbx ; argument "instance" for method _objc_release
00000001004c807f call qword [_objc_release_101c06d18] ; _objc_release
00000001004c8085 mov rsi, qword [0x101f91338] ; @selector(tabbarItem), argument "selector" for method _objc_msgSend
00000001004c808c mov rdi, r14 ; argument "instance" for method _objc_msgSend
00000001004c808f call qword [_objc_msgSend_101c06d08] ; _objc_msgSend
00000001004c8095 mov rdi, rax ; argument "instance" for method imp___stubs__objc_retainAutoreleasedReturnValue
00000001004c8098 call imp___stubs__objc_retainAutoreleasedReturnValue
00000001004c809d mov rbx, rax
00000001004c80a0 mov rsi, qword [0x101f912c0] ; @selector(setBadgeValue:), argument "selector" for method _objc_msgSend
00000001004c80a7 mov rdi, rbx ; argument "instance" for method _objc_msgSend
00000001004c80aa mov rdx, r12
00000001004c80ad call qword [_objc_msgSend_101c06d08] ; _objc_msgSend
00000001004c80b3 mov rdi, rbx ; argument "instance" for method _objc_release
00000001004c80b6 call qword [_objc_release_101c06d18] ; _objc_release
00000001004c80bc test r15b, r15b
00000001004c80bf jne loc_1004c811a

00000001004c80c1 test r12, r12
00000001004c80c4 jne loc_1004c810a

00000001004c80c6 mov rax, qword [objc_ivar_offset_MMContactsViewController__logic]
00000001004c80cd mov rdi, qword [r14+rax] ; argument "instance" for method _objc_msgSend
00000001004c80d1 mov rsi, qword [0x101f8d9e0] ; @selector(getFriendRequestList), argument "selector" for method _objc_msgSend
00000001004c80d8 call qword [_objc_msgSend_101c06d08] ; _objc_msgSend
00000001004c80de mov rdi, rax ; argument "instance" for method imp___stubs__objc_retainAutoreleasedReturnValue
00000001004c80e1 call imp___stubs__objc_retainAutoreleasedReturnValue
00000001004c80e6 mov rbx, rax
00000001004c80e9 mov rsi, qword [0x101f8c248] ; @selector(count), argument "selector" for method _objc_msgSend
00000001004c80f0 mov rdi, rbx ; argument "instance" for method _objc_msgSend
00000001004c80f3 call qword [_objc_msgSend_101c06d08] ; _objc_msgSend
00000001004c80f9 mov r15, rax
00000001004c80fc mov rdi, rbx ; argument "instance" for method _objc_release
00000001004c80ff call qword [_objc_release_101c06d18] ; _objc_release
00000001004c8105 test r15, r15
00000001004c8108 je loc_1004c811a

loc_1004c810a:
00000001004c810a mov rsi, qword [0x101fa0708] ; @selector(reloadAllContacts), argument "selector" for method _objc_msgSend, CODE XREF=-[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]+215
00000001004c8111 mov rdi, r14 ; argument "instance" for method _objc_msgSend
00000001004c8114 call qword [_objc_msgSend_101c06d08] ; _objc_msgSend

loc_1004c811a:
00000001004c811a add rsp, 0x10 ; CODE XREF=-[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]+210, -[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]+283
00000001004c811e pop rbx
00000001004c811f pop r12
00000001004c8121 pop r14
00000001004c8123 pop r15
00000001004c8125 pop rbp
00000001004c8126 ret
; endp
00000001004c8127 jmp -[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]+318
00000001004c8129 jmp -[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]+318
00000001004c812b mov r14, rax ; CODE XREF=-[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]+314, -[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]+316
00000001004c812e mov rdi, rbx
00000001004c8131 call qword [_objc_release_101c06d18] ; _objc_release
00000001004c8137 jmp -[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]+335
00000001004c8139 mov r14, rax
00000001004c813c mov rdi, r14 ; CODE XREF=-[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]+330
00000001004c813f call imp___stubs___Unwind_Resume

第一行函数入口的地址为00000001004c7fed,我们使用xcode的lldb功能。关于使用该功能之前,需要实现给其他地方打断点,让lldb命令窗口出现。开始打断点:br s -a "0x00000001004c7fed"

图3 lldb设置断点 ![设置断点](/uploads/wechat-re/lldb-set-breakpoint.jpg)
打完断点之后,我们再使用开篇说的账号给当前微信发起添加好友的请求。此时,断点起作用了。程序卡住了。说明我们的猜测是正确的。如果还想深入研究汇编语言,那就继续走完断点。否则,直接跳过即可。

我们通过Hopper或者IDA查看一下上述方法friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:的伪代码:

Hopper的伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void -[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:](void * self, void * _cmd, void * arg2, unsigned long long arg3, char arg4) {
r12 = arg3;
r14 = self;
rbx = [[NSString alloc] initWithFormat:@"INFO: contactsvc didChangeFriendRequestUnreadCount: %lu, %d", r12, sign_extend_64(arg4)];
[MMLogger logWithMMLogLevel:0x4 module:"ContactUI" file:0x101a482fd line:0x210 func:"-[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]" message:rbx];
[rbx release];
rbx = [[r14 tabbarItem] retain];
[rbx setBadgeValue:r12];
[rbx release];
if (arg4 == 0x0) {
if (r12 == 0x0) {
rbx = [[r14->_logic getFriendRequestList] retain];
r15 = [rbx count];
[rbx release];
if (r15 != 0x0) {
[r14 reloadAllContacts];
}
}
else {
[r14 reloadAllContacts];
}
}
return;
}

IDA的伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void __cdecl -[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:](MMContactsViewController *self, SEL a2, id a3, unsigned __int64 a4, char a5)
{
char v5; // r15
unsigned __int64 v6; // r12
void *v7; // rax
void *v8; // rbx
MMTabbarItem *v9; // rax
void *v10; // rbx
void *v11; // rax
void *v12; // rbx
void *v13; // r15

v5 = a5;
v6 = a4;
v7 = objc_msgSend(&OBJC_CLASS___NSString, "alloc", a3);
v8 = objc_msgSend(
v7,
"initWithFormat:",
CFSTR("INFO: contactsvc didChangeFriendRequestUnreadCount: %lu, %d"),
v6,
(unsigned int)v5);
+[MMLogger logWithMMLogLevel:module:file:line:func:message:](
&OBJC_CLASS___MMLogger,
"logWithMMLogLevel:module:file:line:func:message:",
4LL,
"ContactUI",
"MMContactsViewController.mm",
528LL,
"-[MMContactsViewController friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]",
v8);
_objc_release(v8);
v9 = ((MMTabbarItem *(__cdecl *)(MMViewController *, SEL))objc_msgSend)(&self->super, "tabbarItem");
v10 = (void *)objc_retainAutoreleasedReturnValue(v9);
objc_msgSend(v10, "setBadgeValue:", v6);
_objc_release(v10);
if ( !v5 )
{
if ( v6
|| (v11 = -[MMContactListLogic getFriendRequestList](self->_logic, "getFriendRequestList"),
v12 = (void *)objc_retainAutoreleasedReturnValue(v11),
v13 = objc_msgSend(v12, "count"),
_objc_release(v12),
v13) )
{
-[MMContactsViewController reloadAllContacts](self, "reloadAllContacts");
}
}
}

很是奇怪,大家都说IDA的伪代码好读,但我觉得的hopper的伪代码更好阅读。

既然hopper的伪代码好阅读,怎么简便怎么来吧。此时我们结合class-dump导出的header文件分析吧。方法的接口定义如下:

1
- (void)friendRequestMgr:(id)arg1 didChangeFriendRequestUnreadCount:(unsigned long long)arg2 isFilter:(BOOL)arg3;

那我们把伪代码用oc重新写一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- (void)friendRequestMgr:(id)arg1 didChangeFriendRequestUnreadCount:(unsigned long long)arg2 isFilter:(BOOL)arg3 {
// 如果是hook,需要把self转换为当前对象
MMContactsViewController *ctl = (MMContactsViewController)self;
NSLog(@"INFO: contactsvc didChangeFriendRequestUnreadCount: %llu, %d", arg2, arg3);
NSTabBarItem *tabbarItem = [self tabbarItem];
// NSTabBarItem *tabbarItem = [ctl tabbarItem];
[tabbarItem setBadgeValue: arg2];
if (arg3 == NO) {
if (arg2 == 0) {
NSMutableArray *friendRequestList = [self->_logic getFriendRequestList];
// NSMutableArray *friendRequestList = [ctl->_logic getFriendRequestList];
NSInteger count = [friendRequestList count];
if (count != 0) {
[self reloadAllContacts];
// [ctl reloadAllContacts];
}
} else {
[self reloadAllContacts];
// [ctl reloadAllContacts];
}
}
}

如果需要在WeChatPlugins中运行,需要把self做强制转换。同时,在header中添加响应的方法和属性的声明。

但是很遗憾,依然没能突破如何添加好友。在微信界面中确认通过好友请求按钮是MMOutlineButton对象,执行的是didLeftMouseDownBlock和didTriggeredActionBlock,但这两块是oc的回调block,具体本人目前无法破译。

还是祭出强大的hooper吧,全局搜索addfriend关键字,看看那些对象或者那些方法更接近添加好友这个功能。

MMStatusItem中有个friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:方法,看起来和前面分析的视图中的类似,都是设置用户添加好友请求的未读消息的总数的。

MMContactInspector中有个addContactAsFriend:方法,更像是添加联系人作为好友。

MMFriendRequestMgr中有个addNewFriendWithContact:verifyContactWrap:completion:addNewFriendWithContact:verifyContactWrap:verifyMsg:completion:,应该是添加好友相关的验证包装。

WeChat中有个addNewFriendWithContact:verifyContactWrap:方法,貌似也是添加好友处理的方法。

我们分别断点这几个方法,看看最终是哪个方法或者哪几个方法起作用。

(lldb) br set -a “0x000000010017a2bb”
(lldb) br set -a “0x000000010057f633”
(lldb) br set -a “0x000000010057f81c”
(lldb) br set -a “0x0000000100a8b408”
(lldb) br set -a “0x0000000100bbfb12”

断点首先进入到0x0000000100bbfb12这里([MMStatusItem friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:]):

图4 微信添加好友验证通过的方法
![](/uploads/wechat-re/wechat-add-friend-100bbfb12.jpg)

由此可以知道,发起添加好友请求时,首先进入到状态同步,如果需要自动添加好友,可以在此处hook。并且在点击好友请求的红点时,也会触发此方法。但是点击“通过验证”时,其他几个均没有触发。说明添加好友的逻辑不在上面这几个里面。

但是总感觉好友请求应该是在MMFriendRequestMgr里面,记起有人hook微信IOS中,有个方法中的参数是opCode,所以,继续添加断点,试探此方法:sendVerifyUserRequestWithUserName:opCode:verifyMsg:ticket:verifyContactWrap:completion:onRecivedContactVerifyMsg:两个方法:

(lldb) br set -a “0x00000001005810de”
(lldb) br set -a “0x0000000100581cfa”

在点击“验证通过”时,进入到0x00000001005810de断点,也就是sendVerifyUserRequestWithUserName:opCode:verifyMsg:ticket:verifyContactWrap:completion:方法。

现在看看该方法的伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
void -[MMFriendRequestMgr sendVerifyUserRequestWithUserName:opCode:verifyMsg:ticket:verifyContactWrap:completion:](void * self, void * _cmd, void * arg2, int arg3, void * arg4, void * arg5, void * arg_0, void * arg_8) {
var_30 = arg3;
var_40 = [arg2 retain];
var_48 = [arg4 retain];
var_50 = [arg5 retain];
var_38 = [arg_0 retain];
var_58 = [arg_8 retain];
rbx = [[NSString alloc] initWithFormat:@"INFO: verifyUser userName:%@, verifyMsg:%@, opcode:%u scene:%u", var_40, var_48, var_30, [var_38 scene]];
[MMLogger logWithMMLogLevel:0x4 module:"FriendRequest" file:0x101a5609d line:0x151 func:"-[MMFriendRequestMgr sendVerifyUserRequestWithUserName:opCode:verifyMsg:ticket:verifyContactWrap:completion:]" message:rbx];
[rbx release];
r14 = [NSString alloc];
r12 = [[var_38 verifyContact] retain];
r15 = [[r12 m_nsAntispamTicket] retain];
r14 = [r14 initWithFormat:@"DEBUG: verifyUser antispamTicket:%@", r15];
[r15 release];
[r12 release];
[MMLogger logWithMMLogLevel:0x5 module:"FriendRequest" file:0x101a5609d line:0x152 func:"-[MMFriendRequestMgr sendVerifyUserRequestWithUserName:opCode:verifyMsg:ticket:verifyContactWrap:completion:]" message:r14];
[r14 release];
if ([var_40 length] != 0x0) {
r15 = [[VerifyUserRequest alloc] init];
[r15 SetOpcode:var_30];
[r15 SetVerifyUserListSize:0x1];
[r15 SetSceneListCount:0x1];
r13 = [[NSNumber numberWithUnsignedInt:[var_38 scene]] retain];
rbx = [[NSMutableArray arrayWithObject:r13] retain];
[r15 setSceneList:rbx];
rdi = rbx;
[rdi release];
[r13 release];
r14 = [[VerifyUser alloc] init];
[r14 SetValue:var_40];
r13 = @selector(length);
if (_objc_msgSend(var_50, r13) != 0x0) {
[r14 SetVerifyUserTicket:var_50];
}
r12 = [[var_38 verifyContact] retain];
rbx = [[r12 m_nsAntispamTicket] retain];
r13 = _objc_msgSend(rbx, r13);
rdi = rbx;
[rdi release];
[r12 release];
COND = r13 == 0x0;
r13 = @selector(length);
if (!COND) {
r12 = [[var_38 verifyContact] retain];
rbx = [[r12 m_nsAntispamTicket] retain];
[r14 SetAntispamTicket:rbx];
rdi = rbx;
[rdi release];
[r12 release];
}
rbx = [[NSMutableArray arrayWithObject:r14] retain];
[r15 setVerifyUserList:rbx];
[rbx release];
if (_objc_msgSend(var_48, r13) != 0x0) {
[r15 SetVerifyContent:var_48];
}
*var_90 = __NSConcreteStackBlock;
*(int32_t *)(var_90 + 0x8) = 0xc2000000;
*(int32_t *)(var_90 + 0xc) = 0x0;
*(var_90 + 0x10) = sub_1005816da;
*(var_90 + 0x18) = 0x101c1c5e0;
*(int32_t *)(var_90 + 0x30) = var_30;
*(var_90 + 0x20) = [var_58 retain];
*(var_90 + 0x28) = [var_40 retain];
rax = [MMCGIRequester requestCGI:0x89 Body:r15 Response:var_90];
rax = [rax retain];
[rax release];
[var_68 release];
[var_70 release];
[r14 release];
[r15 release];
}
[var_58 release];
[var_38 release];
[var_50 release];
[var_48 release];
[var_40 release];
return;
}

方法的原型:

1
- (void)sendVerifyUserRequestWithUserName:(id)arg1 opCode:(int)arg2 verifyMsg:(id)arg3 ticket:(id)arg4 verifyContactWrap:(id)arg5 completion:(CDUnknownBlockType)arg6;

我们前面说到了MMStatusItem的friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:的方法可以hook,但是这个已经处在视图层的下一层,如果添加好友的请求状态点击查看过,并没有处理的时候,该方法不会再次出发。

既然找到了添加好友的方法,那么处理请求展示的方法必然也在MMFriendRequestMgr中。注意查看方法列表,发现onRecivedContactVerifyMsg:感觉上像是处理接收到联系人验证消息的逻辑。我们前面已经打过断点,即:0x0000000100581cfa。我们使用其他号码再次发送添加联系人请求,ok,确实进入到该方法中。

图5 发送添加好友请求的方法
![](/uploads/wechat-re/wechat-add-friend-req-verify-100581cfa.jpg)

那么,我们目前找到了最终的需要处理的两个方法:

onRecivedContactVerifyMsg:

sendVerifyUserRequestWithUserName:opCode:verifyMsg:ticket:verifyContactWrap:completion:

第一个是发送添加请求后,处理请求的方法,第二个是,点击“验证通过”按钮处理添加好友的逻辑的方法。如要自动添加好友,我们只需要hook第一个方法onRecivedContactVerifyMsg:,直接调用第二个方法即可。

图6 通过好友请求的方法
![](/uploads/wechat-re/real-handle-req-params.jpg)

目前hook的自动添加好友的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
hook 微信自动添加朋友

@param oMsgData
*/
- (void)hook_onAutoAddFriend:(MessageData *) oMsgData {
MMFriendRequestMgr *reqMgr = self;
if (![[TKWeChatPluginConfig sharedConfig] autoAddFriendEnable]) {
[self hook_onAutoAddFriend:oMsgData];
return;
}
if (oMsgData == nil) {
NSLog(@"添加好友请求数据不能为nil");
return;
}
NSString * msgContent = [oMsgData msgContent];
if ([msgContent length] <= 0) {
NSLog(@"添加好友请求数据oMsgData.msgContent不能为空");
return;
}
if ([msgContent rangeOfString:@"<msg"].length <= 0) {
NSLog(@"添加好友请求数据oMsgData.msgContent格式错误");
return;
}
// 转换群聊的 msg
msgContent = [msgContent substringFromIndex:[msgContent rangeOfString:@"<msg"].location];
// xml 转 dict
NSError *error;
NSDictionary *msgDict = [XMLReader dictionaryForXMLString:msgContent error:&error];
if (error || !msgDict[@"msg"]) {
NSLog(@"数据字典不正确");
return;
}
NSDictionary *reqData = [msgDict valueForKey:@"msg"];
MMFriendRequestData *friendReqData = [[objc_getClass("MMFriendRequestData") alloc] initWithDictionary: reqData];
[friendReqData setScene: [reqData[@"scene"] intValue]];
[friendReqData setOpCode:[reqData[@"opcode"] intValue]];
[friendReqData setUserName:reqData[@"fromusername"]];
[friendReqData setNickName:reqData[@"fromnickname"]];
[friendReqData setRegion:reqData[@"province"]];
[friendReqData setUserSignature:reqData[@"sign"]];
[friendReqData setEncryptuserName:reqData[@"encryptusername"]];
[friendReqData setTicket:reqData[@"ticket"]];
if ([[reqData valueForKey:@"content"] length] > 0) {
NSMutableArray *reqContent = [friendReqData requestContents];
if (reqContent == nil) {
reqContent = [[NSMutableArray alloc] initWithCapacity:1];
}
[reqContent addObject:reqData[@"content"]];
[friendReqData setRequestContents:reqContent];
}
if (![friendReqData isLbsGreeting]) {
WCPushContactData *contact = [objc_getClass("CUtility") GenPushContactFromMsgData: oMsgData];
[friendReqData setContact:contact];
MMFriendRequestDataCollection *reqDataCollection = [reqMgr friendRequestDataCollection];
NSUInteger count = (reqDataCollection == nil || [[reqDataCollection data] count] <= 0) ? [msgDict count]: [[reqDataCollection data] count];
NSLog(@"添加好友请求人数为:%lu", (unsigned long)count);
if (count > 0) {
NSString *userName = [oMsgData valueForKey:@"toUsrName"];
if (![[friendReqData userName] isEqualToString:userName]) { // 不是自己加自己
// 各种处理看不下去了...直接处理发送请求吧
NSLog(@"开始处理添加好友~~~%@,昵称:%@",[friendReqData userName], [friendReqData nickName]);
[reqMgr sendVerifyUserRequestWithUserName:[friendReqData userName] opCode:[friendReqData opCode] verifyMsg:nil ticket:[friendReqData ticket] verifyContactWrap:nil completion:nil];
}
}
}

}

目前遗留问题:其一:[reqMgr sendVerifyUserRequestWithUserName:[friendReqData userName] opCode:[friendReqData opCode] verifyMsg:nil ticket:[friendReqData ticket] verifyContactWrap:nil completion:nil];这句代码最后一个参数是Block,但是具体是什么,目前还没研究清楚。其二:电脑端自动通过好友请求之后,没有跟其他平台客户端做同步,这个可能是onRecivedContactVerifyMsg这个方法重写有问题,也可能就是上面block中的内容。

但是,目前是可以自动通过好友请求的。其他的后面再做研究。

2018-02-27 16:54:45 @Joyven