1、明确需求

当App收到通知时,Icon右上角都会有红点显示通知个数,现在的需求是去掉这个红点显示。
image.png

2、整理思路

思路大致和喜马拉雅去暂停广告的思路一致,先确定红点的类,然后再hook它的初始化方法,来去掉红点。
第一步:找到红点的类名
image.png
但是Reveal不会识别iOS的桌面程序,那就只能通过Cycript的方式来试试了,进入SpringBoard的Cycript调试环境,导入mjcript,打印RootVC和其view的层级结构:
cy# MJRootVc()

  1. #"<SBHomeScreenViewController: 0x14d205d60>"

cy# MJSubviews (#0x14d205d60.view)

  1. ...
  2. <SBIconBadgeView: 0x14d5f3060; frame = (45 -11; 26 26); layer = <CALayer: 0x28332a4a0>>
  3. ...

输出RootVC的view层级结构后会打印很多view,这时就需要根据经验去找到红点所属的类,通过观察发现SBIconBadgeView的类名包含Icon和Badge符合红点的特征,而且frame的y是-11,所以可以通过设置隐藏的方式验证:cy# #0x14d5f3060.hidden = YES
image.pngimage.png
可以看到抖音右上角的红点已经被隐藏了,现在可以确定红点的类名是:SBIconBadgeView。
第二步:分析头文件
通过 $ ps -A 指令打印可以发现Spring Board的可执行文件路径:

  1. ...
  2. 15005 ?? 0:00.00 /System/Library/CoreServices/SpringBoard.app/SpringBoard
  3. ...

用iFunBox将SpringBoard复制到Mac,发现只有96KB,而且通过class-dump也无法导出头文件。
image.png
这时就需要使用classdump-dyld来导出SpringBoard的头文件了:
cy# classdumpdyld.dumpBundleForClass(SBIconBadgeView)

  1. @"Wrote all headers to /tmp/SpringBoardHome"

用iFunBox将SpringBoardHome复制到Mac,用Sublime Text打开:
image.png
发现SBIconBadgeView有一个init初始化方法,那么就可通过hook这个方法来隐藏红点。

3、编写代码

创建tweak项目,打开Tweak.x文件,编写tweak代码:

  1. %hook SBIconBadgeView
  2. // 初始化方法返回nil
  3. - (id)init {
  4. return nil;
  5. }
  6. %end

将插件安装到手机上。

4、最终效果

image.png
图标上的红点已经去掉了。