Cycript

作者: king_jensen | 来源:发表于2018-12-31 17:58 被阅读25次

    Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了OC、JavaScript语法的解释器,这意味着我们能够在一个命令中使用OC或者JavaScript,甚至两者并用。它能够挂钩正在运行的进程,能够在运行时修改很多东西。

    Cycript安装

    下载后使用Cycript可执行文件。下载地址
    为了方便,我们可以放在 /opt/cycript_0.9.594 (opt目录有可选的意思)
    为了方便使用,可以在~/.bash_profile中配置环境变量(执行文件路径)。

    16FD0EE5864D9AC3E0B0C45206BC8A09.png

    安装后执行报错:

    6A2A6999011C7FE526C3DF5EA051CDDF.png
    可以使用这个(解决方案)[https://www.cnblogs.com/WinJayQ/p/8886978.html]进行处理。

    Cycript使用

    Cycript需要附加到应用进程,才可以调试应用(Cycript –r ip:port)。
    退出Cycript环境,Ctrl + D
    我们使用MonkeyDev创建应用,MonkeyDev会在应用中注入cycript.framework,并且为当前应用打开一个端口(6666),作为server。
    Mac端的cycript作为client去链接server,连接:cycript -r 192.168.0.109:6666
    为了让每次登录更方便一些,可以将cycript -r 192.168.0.109:6666写成脚本cyLogin.sh,并配置环境变量,就可以直接. cyLogin连接。

    一.Cycript常用调试命令:

    1.UIWindow.keyWindow() 获取keyWindow
    2.UIApp 获取APPlication单例对象
    3.recursiveDescription() 循环打印子视图
    4.toString() 格式化打印(遇到\n换行)
    5.# 对象地址。拿到该对象,可用于调用方法
    6.* 对象地址。可以取出对象的成员变量
    7.Choose(类名) 查询当前进程中该类型的对象。

    二.Cycript高级语法

    pviews()
    pvc()
    pactions(#0xxxxxxxxx)
    rp(#0xxxxxxxxx)
    appid 当前bundleid

    三.自定义
    Cycript是一门脚本语言,它可以加载封装好的.cy文件。
    我们会将常见的Cycript常用功能封装到.cy文件中,便于调试。
    我们之所以能使用高级语法,是因为使用MonkeyDev创建工程,MonkeyDev导入了一些高级语法.


    119584E1CDB19C80494B51BBF23F0D54.png

    因此,我们也可以自定义语法。
    1.新建文件jensen.cy,Type改为JavaScript Source
    2.封装代码

    //IIFE 匿名函数自治县表达式
    (function(exports) {
    
        JNROOTVC = function(){
            return  UIApp.keyWindow.rootViewController;
        }
        JNKEYWIND = function(){
            return  UIApp.keyWindow;
        }
    
        JNGetCurrentVCFromRootVc = function(rootVC){
            var currentVC;
            if([rootVC presentedViewController]){
            //视图被persent出来的
                rootVC = [rootVC presentedViewController];
            }
    
            if([rootVC isKindOfClass:[UITabBarController class]]){
                // 根视图如果是UITabBarController
                currentVC = JNGetCurrentVCFromRootVc(rootVC.selectedViewController);
            }else if([rootVC isKindOfClass:[UINavigationController class]]){
                //根视图如果是UINavigationController
                currentVC = JNGetCurrentVCFromRootVc(rootVC.visibleViewController);
            }else{
                //视为当前控制器
                currentVC = rootVC;
            }
            return currentVC;
        };
    
        JNCurrentVC = function(){
            return JNGetCurrentVCFromRootVc(JNROOTVC());
        };
    
    })(exports);
    
    

    3.在Build Phases-->Copy Files引入jensen.cy


    A496B13BD1A5E68CA47136DF4276CFFB.png

    4.cycript测试使用


    8DD28B21360B858BF6F4175532B89D27.png

    相关文章

      网友评论

          本文标题:Cycript

          本文链接:https://www.haomeiwen.com/subject/xaoilqtx.html