JSPatch在MAC下的使用

简单调研JSPatch的使用,之所以在MAC下是因为可以创建一个命令行的应用,简化无关代码。具体做法如下:

第一步,去https://github.com/bang590/JSPatch/tree/master/JSPatch下载JSEngine.h、JSEngine.m和JSPatch.js三个文件,并拖入工程,并选择Copy items if needed:

第二步,添加一个被测试的类,并给它定义一个类方法,稍后我们将用JSPatch替换该方法。我在该方法中输出了字符串:Hello World!

// TestObj.h
#import <Foundation/Foundation.h>

@interface TestObj : NSObject
-(void)mainProc;
@end
//TestObj.m
#import "TestObj.h"

@implementation TestObj
-(void)mainProc
{
    NSLog(@"Hello World!");
}
@end

第三步,在main函数中接收两个参数,一个是在第一步中下载的JSPatch.js,另一个是用来做热补丁的js文件,命名为demo.js

紧接着就可以执行JSPatch的策略了,之后才是业务逻辑。必须在执行业务逻辑之前执行JSPatch策略,这样才能让对业务逻辑中的类或方法的替换生效。

#import <Foundation/Foundation.h>
#import "JPEngine.h"
#import "TestObj.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 传入JSPatch.js和demo.js的路径
        if (argc != 3) {
            NSLog(@"usage: testJP [JSPatch.js path] [replace js path]");
            return -1;
        }
        NSString *jsPatchPath = [NSString stringWithUTF8String:argv[1]];
        NSString *replaceJSPath = [NSString stringWithUTF8String:argv[2]];

        [JPEngine startEngine:jsPatchPath];
        NSString *script = [NSString stringWithContentsOfFile:replaceJSPath encoding:NSUTF8StringEncoding error:nil];
        [JPEngine evaluateScript:script];

        // 实例化TestObj,并调用将被JSPath替换的方法
        TestObj *obj = [[TestObj alloc]init];
        [obj mainProc];
    }
    return 0;
}

第四步,编写热补丁文件,用于替换第二步中的TestObj的mainProc方法:

// demo.js
// 替换TestObj的mainProc方法
defineClass(‘TestObj‘, {
  mainProc: function() {
    console.log("Hello, JSPatch!");
  }
});

以上就是应用JSPatch替换掉OC代码中TestObj的mainPrco方法的步骤,不过要想在MAC Command Line下能跑,还得对JPEngine稍作修改:

1、JPEngine依赖了UIKit/UIApplication.h,这是应用于iOS UIKit的头文件,可以直接注掉。

2、在startEngine函数中有如下一段调用,这也是在iOS中用于响应内存警告的,也可以直接注掉。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];

3、紧接着往下是如下一段代码,这是直接在bundle中查找JSPatch.js,而我们创建的是命令行应用而不是app,尽管在第一步中把JSPatch.js拖入了工程,通过下面的方法也是拿不到JSPatch.js的,

NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"JSPatch" ofType:@"js"];
NSAssert(path, @"can‘t find JSPatch.js");
NSString *jsCore = [[NSString alloc] initWithData:[[NSFileManager defaultManager] contentsAtPath:path] encoding:NSUTF8StringEncoding];

因此,我把JPEngine的startEngine方法由无参改成接收一个NSSting*参数,通过命令行第一个参数把JSPatch.js的路径传进来,前面这段代码可以改为如下,jsPatchPatch是startEngine的参数

//*#*# 注掉path,改为传参
//    NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"JSPatch" ofType:@"js"];
//    NSAssert(path, @"can‘t find JSPatch.js");
    NSString *jsCore = [[NSString alloc] initWithData:[[NSFileManager defaultManager] contentsAtPath:jsPatchPath] encoding:NSUTF8StringEncoding];

经过以上改造,JSPatch就可以在MAC下使用了。实例代码可在https://github.com/palanceli/TestJSPatch/tree/master下载。

本文只是简单摸索一下JSPatch的使用,并没有深入到JSPatch内部,据说这种热补丁覆盖面太广会让效率不彰,因为它是利用字符串反射找到对应类和方法的。我认为JSPatch的应用目标就是用来打补丁而不是用于组件化,临时遇到bug,需要紧急修复还是很适合用JSPatch的,下发一个js文件即可,小巧、便捷,组件化的问题则要靠框架设计来解决。

时间: 2025-01-31 09:49:03

JSPatch在MAC下的使用的相关文章

Mac下获取AppStore安装包文件路径

本文介绍了Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用的相关步骤,希望对大家有所帮助. 通过远在大洋彼岸的苹果服务器下载东西,确实有够慢啊!AppStore更甚:甚至都经常提示连不上服务器,而有些软件呢,还必须从AppStore下载安装,所以没办法,谁让上了苹果的贼船呢!公司的网速更是不敢恭维,以至于基本上不下东西,除非像这次一样:手贱的把iPhone6升级到8.2.2了,然后Xcode6.1.1真机调试不成了,所以需要下个Xcode6.2.昨天刚更新的Xcode

.NET跨平台之mac 下vs code 多层架构编程

合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入,申请备注填写姓名+技术+工作年限) Q  Q:408365330     E-Mail:[email protected] 概述: 为了研究跨平台.NET 开发,我打算利用.NET core 编写一个跨平台的cms,这个CMS我也秉着开源的原则放到github上面,为.NET 开源社区做点小小的贡献吧.如果有兴趣的可以联系我一起为.NET开源和跨平台做点小小的贡献吧.EgojitCMS传送

Mac&#160;下locate命令使用问题WARNING: The locate database (/var/db/locate.database) does not exist.

想在Mac下使用locate时,提醒数据库没创建: WARNING: The locate database (/var/db/locate.database) does not exist. To create the database, run the following command: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist Please be aware that the d

mac下创建cocos2d-x 3.7项目

因为之前开发都是在window下进行开发,而且都是用quick进行开发,因此对c++以及在Mac下的开发还不是很了解,最近买了台Mac,想把这方面补给一下,做一下笔记. 首先先去cocos2d-x官网上下载cocos2d-x3.7,在打开终端,进入cocos2d-x3.7文件夹下的: cocos2d-x-3.7/tools/cocos2d-console/bin目录下,输入命令: ./cocos.py new HelloWorldDemo -p com.coco2dx.org -l cpp -d

关于Mac下的SSH客户端iterm2等配置

linux后台开发的同学们晓得,在windows下有xshell\securecrt这样优秀的ssh客户端软件.mac下查找了下,有securecrt mac版,网上也有破解的,试用了一段时间,一个问题始终没有能解决——ssh链接偶尔会断掉.关于这个问题,先说下leby的工作环境吧:我们是不能直接ssh目标主机的,必须用ssh代理中转,于是搭建了一个HTTP的proxy,这之前在windows下xshell工作很好.在mac的scrt下,总是会随机掉线,一些超时配置当然是试过的,不能解决问题.

mac下,mysql5.7.18连接出错,错误信息为:Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)

mac下,mysql5.7.18连接出错,错误信息为:Access denied for user 'root'@'localhost' (using password: YES)()里面的为shell中输入的命令,一定要输全包括:&等符号 第一步:苹果->系统偏好设置->最下面点MySQL,关闭mysql服务 第二步:进入终端输入(cd /usr/local/mysql/bin/)回车输入(sudo su)回车以获取管理员权限输入(./mysqld_safe --skip-grant

Mac下切换Python版本

Mac下有多个版本的Python时,需要进行版本切换.我使用的是anaconda,在终端下进行包安装时,默认Python版本是MacOS自带的Python,需要进行手动的版本切换. # 将anaconda的bin目录加入PATH,根据版本不同,也可能是~/anaconda3/bin echo 'export PATH="~/anaconda2/bin:$PATH"' >> ~/.bashrc # 更新bashrc以立即生效 source ~/.bashrc 以我主机为例,切

mac下配置maven环境变量

记下配置mac下maven环境变量的问题. 下载maven 后解压到某一路径下.根据网上很多人的方法,echo ??M3_HOME只能得到路径.但 mvn --version是没用的, 还是会提示 command not found. jdk是没有任何问题的.所以应该解决的还是maven的问题. 修改bash_profile vim ~/.bash_profile 输入以下内容: 即可.

整理MAC下Eclipse的常用快捷键

整理Eclipse常用快捷键 开发环境切换到Mac下后原来Window下的快捷键很大一部分是不相容的,习惯了快捷键的生活忽然哪天快捷键不起作用了,跟着的就是开发效率明显降低,频繁录入错误的快捷键让Eclipse都不知道你想要什么了. 以下内容是我整理的经常使用的Eclipse快捷键,主要依据首个按键进行了分类. 文档末尾是收集了Mac系统下对文本编辑当标跳转或选中的快捷键. 一.Command类 Command+1 快速修复 Command+d 删除当前行 Command+Option+↓ 复制