Cycript是Objective-C++、ES6(JavaScript)、Java等语法的混合物, 可以用来探索、修改、调试正在运行的Mac\iOS APP。我们可以通过官网和文档来学习 。
Cycript使用步骤
-
在iPhone上通过Cydia安装Cycript,即可在iPhone上调试运行中的APP
-
在Mac终端使用SSH连上iPhone
-
开启cycript
-
在iPhone的root用户目录下,输入cycript
-
调试iOS App
5.1 获取需要调试的app的进程id(当然首先需要启动这个app)
在iPhone上安装adv-cmds插件, 然后就可以使用ps -A(或者ps aux) 命令来显示当前iPhone所有的进程信息,从里面找到对应的进程id。
如果数据太多,可以通过(ps –A | grep 关键词)来根据关键词筛选。
注 : ps命令是process status的缩写,使用ps命令可以列出系统当前的进程。
5.2 通过以下命令关联App进程
cycript -p 进程ID
或者cycript -p 进程名称
5.3 通过cycript代码操作App, 例如
UIApp <-> 打印UIApplication单例对象
[UIApplication sharedApplication] <-> 打印UIApplication单例对象
var 变量名 = 变量值 <-> 定义变量
#内存地址 <-> 用内存地址获取对象
ObjectiveC.classes <-> 已加载的所有OC类
*对象 <-> 查看对象的所有成员变量
view.recursiveDescription().toString() <-> 递归打印view的所有子控件(跟LLDB一样的函数)
choose(UIViewController) <-> 筛选出某种类型的对象
choose(UITableViewCell) <-> 筛选出某种类型的对象
注:
取消输入 Ctrl + C
退出 Ctrl + D
清屏 Command + R
Cycript高级使用
我们可以将常用的Cycript代码封装在一个.cy文件中,例如我们可以将获取当前app的主窗口的根视图控制器的代码封装到一个文件中。
-
使用文本编辑工具(vim或者Sublime Text)编辑mycycript.cy文件
-
输入下面代码
//exports参数名固定,用于向外提供接口
(function(exports){
exports.rootVC = function() {
return UIApp.keyWindow.rootViewController;
};
keyWin = function() {
return UIApp.keyWindow
}
})(exports)
那么这个mycycript.cy文件怎么使用呢?
-
我们可以将这个文件放到iPhone的/usr/lib/cycript0.9目录下
-
按照上面的Cycript的使用步骤先SSH登录iPhone,然后开启Cycript,关联上app进程
-
在命令行导入文件@import mycycript, 其中mycycript是自己定义的文件名。
如果这个文件有更多的子目录,例如放在了/usr/lib/cycript0.9/com/baidu下面,那么是@import com.baidu.mycycript
-
使用定义的函数或者变量
在命令行输入mycycript.rootVC()打印根视图控制器
在命令行输入keyWin()打印主窗口对象
注意:rootVC函数定义时前面加了exports表示这个函数属于文件,所以调用时前面需要加上文件名.函数名(), keyWin函数定义时前面什么也没有写,表示是全局函数,调用时函数名前面就 不 需要加文件名.函数名()。