编写自己的tweak
我们要编写tweak的目标往往是引起我们兴趣的软件, 而这个引起我们兴趣的软件元素一般是: 功能和数据.
-
从UI入手, 找出UI函数
对于App, 我们感兴趣的现象往往体现在UI上, UI展示了函数的执行过程和结果. 如果能拿到UI对象, 那么取到它对应的函数也很简单. 我们称这个函数是UI函数. 这个过程我们一开始可以利用cycript工具. 后面会介绍一个很强大的工具. 这里只是熟悉下cycript的简单使用.
下面我以微信这个界面为例:
-
用Cycript注入到目标的进程, 这里以微信的注册界面为例.
-
查看当前的UI层次结构, 定位到我们要寻找的控件, 这里我们以寻找 下一步 按钮为例.
-
然后输入如下命令:
[[UIApp keyWindow] recursiveDescription].toString()复制代码
UIApp 是[UIApplication sharedApplication] 的简写
调用这个方法即可打印keyWindow的视图结构:
-
可以看到每个视图的信息都被展示在 <>里, 其中缩进的多少体现了视图间的关系.缩进少的视图是缩进多视图的父视图 .然后通过#操作符号 + 控件地址, 就可以拿到任意的控件:
-
通过UI表现上看我们要找的控件有可能是按钮, 所以我们搜索UIButton这个类, 然后利用控件的hidden属性查找目标对象.
由于过程简单所以这里不展示寻找过程, 最后找到目标是 FixTitleColorButton 这个类.
可以看到baseClass是UIButton, 证明我们猜测对了.
- 下面就开始获取这个按钮的点击方法:
UIControl类提供了actionsForTarget:forControlEvent: 方法获取UIControl的响应方法. 所以只要目标控件是UIControl子类就可以通过这个方法获取响应函数.
可以看到我们的目标控件点击的时候调用这个方法:
[FixTitleColorButton实例 onNext]复制代码
由于在查找目标控件的过程过于麻烦, 所以介绍一个很好用的工具FLEXLoader. 通过Cydia搜索并下载. 然后在设置界面打开它, 并配置可以操作的App.
然后打开目标App就可以看到FLEXLoader工具栏.
可以看到FLEXLoader工作界面很简洁, 具体使用也很简单.
首先点击select, 然后就可以选择我们的控件了.对应的也会显示控件类. 如果我们要找的控件被覆盖, 那么可以通过views查看图层.
可以看到我们要找的FixTitleColorButton被UIImageView覆盖了. 当我们点击FixTitleColorButton后就会看到我们选中的控件.
如果感觉选中的不是目标控件, 那么可以通过move这个功能移动所选控件来查看是不是目标控件. 然后继续循环这个操作来查找到目标控件.
找到了目标控件类, 然后在去通过cycript做具体操作即可.