简单调研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 != ) {
NSLog(@"usage: testJP [JSPatch.js path] [replace js path]");
return -;
}
NSString *jsPatchPath = [NSString stringWithUTF8String:argv[]];
NSString *replaceJSPath = [NSString stringWithUTF8String:argv[]]; [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 ;
}

第四步,编写热补丁文件,用于替换第二步中的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文件即可,小巧、便捷,组件化的问题则要靠框架设计来解决。

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

  1. mac下安装及配置tomcat

    mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...

  2. MAC下 mysql不能插入中文和中文乱码的问题总结

    MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...

  3. 【开发软件】 在Mac下配置php开发环境:Apache+php+MySql

    本文地址 原文地址   本文提纲: 1. 启动Apache 2. 运行PHP 3. 配置Mysql 4. 使用PHPMyAdmin 5. 附录   有问题请先 看最后的附录   摘要: 系统OS X ...

  4. 2016年最新mac下vscode配置golang开发环境支持debug

    网上目前还找不到完整的mac下golang环境配置支持,本人配置成功,现在整理分享出来. mac最好装下xcode,好像有依赖关系安装Homebrew打开终端窗口, 粘贴脚本执行/usr/bin/ru ...

  5. 【工匠大道】Mac下Java开发环境配置简述

    本文地址 原文地址 分享提纲: 1. 下载JDK1.7 2. 配置java_home 3 .安装tomcat 4 .安装eclipse或者myeclipse 5.  mysql安装 破解版下载请参考M ...

  6. mac下查看.mobileprovision文件及钥匙串中证书.cer文件

    mac下查看.mobileprovision文件及钥匙串中证书.cer文件 一. mobileprovision文件查看 xxx.mobileprovision是ios开发中的设备描述文件,里面有证书 ...

  7. mac 下JDK 与 tomcat 的安装与配置

    一.Mac下JDK的安装 1.先检测Mac是否已经安装过JDK,在终端中输入java 或者 javac 显示说明,表明已经安装过JDK,JDK版本查询终端键入java -version,终端会返回JD ...

  8. svn服务器地址变换以后,mac下的处理方法

    svn服务器地址变换之后,mac下的处理方法 svn服务器地址变换之后,mac下的处理方法 1.进入终端,进入项目所在的文件夹下: cd 项目位置/ 2.查看svn信息 svn info 3.输出结果 ...

  9. 谈iOS抓包:Mac下好用的HTTP/HTTPS抓包工具Charles

    在Mac下做开发,用Fiddler抓包由于离不开Windows比较痛苦,还好有Charles,到官网http://www.charlesproxy.com/可下载到最新版本(若不支持rMBP可拖到Re ...

随机推荐

  1. MySQL 用户权限详细汇总(转)

    1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVO ...

  2. 树结构ztree的 ajax交互的简单使用

    今天做前端页面要用到树结构,用了第三方插件ztree,搞了好久不过终于弄出来了,, 一点小心得.(用的版本 V3 ) 首先看下载的文件结构: 一:将要用到的CSS 和 JS 拷贝到工程中,我这里在工程 ...

  3. ORA-28547:connection to server failed, probable Oracle Net admin error错误,解决方法

    当用navicat连接oralce数据库时报ORA-28547错误时,直接懵逼了,上网查了资料说是navicat自带的oci.dll文件的版本和服务器端的oralce数据库的版本不一致造成的. 修改O ...

  4. MD5加密 及获得密码盐

    MD5加密 及获得密码盐 using System; using System.Collections.Generic; using System.Configuration; using Syste ...

  5. DATAX动态参数数据传递

    实例:ORACLE到ORACLE的数据传递   编写job.xml文件,添加变量参数 执行datax.py文件时记得带参数 格式:./datax.py –p"-Ddbname=*** -Di ...

  6. 在struts2中配置自定义拦截器放行多个方法

    源码: 自定义的拦截器类: //自定义拦截器类:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet ...

  7. 机器学习:集成学习(OOB 和 关于 Bagging 的更多讨论)

    一.oob(Out - of - Bag) 定义:放回取样导致一部分样本很有可能没有取到,这部分样本平均大约有 37% ,把这部分没有取到的样本称为 oob 数据集: 根据这种情况,不对数据集进行 t ...

  8. java代码分解质因数

    总结: 循环...首位 逻辑要清晰 很简单.首先质因数最小的2.因为1不是质数 然后当输入的数刚好为2时,结束.不用下一步了.否则在循环里不停的输出一个数, 当输入的数比2大时,分能被2整除和不能被2 ...

  9. Solaris10如何确认DirectIO是否已经启用

    对于Oracle而言,如果数据库存储在UFS文件系统上,启用DirectIO能够提高数据库性能.Oracle有个参数filesystemio_options可以控制数据库是否使用DirectIO.  ...

  10. 通过XmlSerializer接口来生成xml文件

    xml文件我们可以用来保存一些数据.例如用来备份短信.这个例子中,我们就用XmlSerializer接口来实现一个备份短信的程序.当然了,为了程序简单化,这个程序我们并不是真的去备份短信.我们通过一个 ...