1、明确需求
当App收到通知时,Icon右上角都会有红点显示通知个数,现在的需求是去掉这个红点显示。
2、整理思路
思路大致和喜马拉雅去暂停广告的思路一致,先确定红点的类,然后再hook它的初始化方法,来去掉红点。
第一步:找到红点的类名
但是Reveal不会识别iOS的桌面程序,那就只能通过Cycript的方式来试试了,进入SpringBoard的Cycript调试环境,导入mjcript,打印RootVC和其view的层级结构:
cy# MJRootVc()
#"<SBHomeScreenViewController: 0x14d205d60>"
cy# MJSubviews (#0x14d205d60.view)
...
<SBIconBadgeView: 0x14d5f3060; frame = (45 -11; 26 26); layer = <CALayer: 0x28332a4a0>>
...
输出RootVC的view层级结构后会打印很多view,这时就需要根据经验去找到红点所属的类,通过观察发现SBIconBadgeView的类名包含Icon和Badge符合红点的特征,而且frame的y是-11,所以可以通过设置隐藏的方式验证:cy# #0x14d5f3060.hidden = YES
可以看到抖音右上角的红点已经被隐藏了,现在可以确定红点的类名是:SBIconBadgeView。
第二步:分析头文件
通过 $ ps -A 指令打印可以发现Spring Board的可执行文件路径:
...
15005 ?? 0:00.00 /System/Library/CoreServices/SpringBoard.app/SpringBoard
...
用iFunBox将SpringBoard复制到Mac,发现只有96KB,而且通过class-dump也无法导出头文件。
这时就需要使用classdump-dyld来导出SpringBoard的头文件了:
cy# classdumpdyld.dumpBundleForClass(SBIconBadgeView)
@"Wrote all headers to /tmp/SpringBoardHome"
用iFunBox将SpringBoardHome复制到Mac,用Sublime Text打开:
发现SBIconBadgeView有一个init初始化方法,那么就可通过hook这个方法来隐藏红点。
3、编写代码
创建tweak项目,打开Tweak.x文件,编写tweak代码:
%hook SBIconBadgeView
// 初始化方法返回nil
- (id)init {
return nil;
}
%end
4、最终效果
图标上的红点已经去掉了。