本章的实例模块划分明显,任务分工明确,搭建tweak原型时的思路非常清晰,具体如下。
1.在界面上寻找添加白名单按钮的地方和方法
本着既要直观又要美观的原则,我们在简单尝试了几种方案之后,决定把白名单按钮添加在Mailboxes界面的左上角。通过Cycript拿到MailboxPickerController的套路已是驾轻就熟,在导航栏添加按钮自然是水到渠成。
2.在protocol里寻找“刷新完成”的响应函数
同第7章“寻找实时监测字数变化”的方法一脉相承,本章以MailboxContentView-Controller.h中的protocol为线索,通过遍历头文件,猜测关键词的方法,找到了“刷新完成”的响应函数。经过测试,megaMallMessageCountChanged:会在邮件数量发生变化时得到调用,符合条件。
3.从MessageMegaMall中拿到所有邮件
根据“协议方法被调用,一般是因为方法名中提到的那个事件发生了;而那件事发生的对象,一般是协议方法的参数”的经验,在megaMallMessageCountChanged:的参数中发现了MessageMegaMall这个类。“大型购物中心”的名字很隐晦,通过对它的调查,发现它就是一个保存了所有邮件的M。调用[MessageMegaMall copyAllMessages],可以拿到所有邮件。
4.从MFLibraryMessage中提取发件人地址
通过[MessageMegaMall copyAllMessages]拿到的邮件类型是MFLibraryMessage。通览MFLibraryMessage及相关头文件,用LLDB测试几个可疑的property和函数,很容易就可以从中提取发件人地址。
5.用MessageMegaMall将邮件标记为已读
在调查MessageMegaMall时,就已经注意到了可疑的markMessagesAsViewed:,几乎不需要测试就能肯定它是将邮件标记为已读的函数,当然,LLDB的测试结果也直接证明了这个结论的正确性。
注意 为了简化示例,8.4节的白名单仅含有一个邮箱地址,以UIAlertView的形式展现给用户。作为练习,你可以把它扩充成一个UITableView,让它变得更实用。