JSPatch 是一个开源项目(Github链接),只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。
除了实时修复线上 bug,甚至为 APP 动态添加一个模块也是可行的,不过可能会有性能问题。
使用JSPatch 需要有一个后台可以下发和管理脚本,并且需要处理传输安全等部署工作。
目前有一个JSPatch 平台提供了一系列的服务,只需引入一个 SDK 就能使用 JSPatch,只是还在内测中....
地址 :https://github.com/bang590/JSPatch

CocoPods安装:

Podfile文件

platform :ios, '6.0'
pod 'JSPatch'

然后

pod install

下面开始使用:我们先创建一个列表,再通过JSPath改变行数

1.我们先在Controller里加入一个列表,让他显示3行 ,代码如下:

#import "JRViewController.h"

@interface JRViewController ()<UITableViewDataSource,UITableViewDelegate>
@property(nonatomic,strong)UITableView* myTableView;
@end @implementation JRViewController - (void)viewDidLoad {
[super viewDidLoad];
UITableView* tv =[[UITableView alloc]initWithFrame:self.view.bounds
style:UITableViewStylePlain];
self.myTableView = tv;
self.myTableView.delegate = self;
self.myTableView.dataSource = self;
[self.view addSubview:self.myTableView];
}
#pragma mark -- UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString* i= @"cell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:i];
if (cell == nil ) {
cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:i];
}
cell.textLabel.text = @"title";
return cell;
}

运行一下,显示3行,没问题

Paste_Image.png

2.创建js文件 New File -> ios -> Empty .....

Paste_Image.png

3.在js文件中 写入:

 //将JRViewController类中的- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section方法替换掉
defineClass('JRViewController', {
tableView_numberOfRowsInSection: function(tableView, section) {
return 10;
},
});

关于JSPath的具体使用,请自行查阅:https://github.com/bang590/JSPatch/wiki

4.调用这个js文件,代码如下:

#import "AppDelegate.h"
#import "JPEngine.h"
@interface AppDelegate ()
@end
@implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JPEngine startEngine];
NSString* path = [[NSBundle mainBundle]pathForResource:@"JSPathTest" ofType:@"js"];
NSString* js = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
[JPEngine evaluateScript:js];
return YES;
}

运行一下,现在是显示10行了 !

Paste_Image.png

注:
如果我们想要通过 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug的话,还是要通过服务器下发 js脚本 !

代码如下:

[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://........"]]
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[JPEngine evaluateScript:script];
}];

工具
将OC代码装换成JSPatch script

最新文章

  1. js 理解new的运行机制
  2. Res_Orders_02
  3. TCP/IP协议和HTTP协议 浩哥指教
  4. 使用 PowerShell 自动登录Azure
  5. [整理]VS2013常用插件
  6. 16 SQL Tuning Overview
  7. linux进程编程:子进程创建及执行函数简介
  8. 原生js 用正则实现removeclass hasclass getsclass addclass .
  9. highstock实现股票分时
  10. 关于浮动-float
  11. 怎样通过WireShark抓到的包分析出SIP流程图
  12. public static void speckOnWin7(string text),在win7中读文字
  13. sublime Text2 快捷键精华版
  14. 20172306 2018-2019-2 《Java程序设计与数据结构》第八周学习总结
  15. Codeforces Round #411 div 2 D. Minimum number of steps
  16. 安装配置Glusterfs
  17. markdown添加本地图片
  18. ghost系统下,C#获取时间带星期几的解决办法
  19. 知乎日报 API 分析
  20. 一个老IT产品管理者对于产品经理工作的经验总结

热门文章

  1. bzoj2251 [2010Beijing Wc]外星联络
  2. Linux系统巡检常用命令
  3. Python快速建站系列-Part.Four-首页内容填充
  4. Bug测试报告--在线考试系统--金州勇士
  5. viewpager实现酷炫侧滑demo
  6. Linux VFS中write系统调用实现原理【转】
  7. Java 中System里getProperty(something)
  8. jQuery 选择器 (基础恶补之二)
  9. noi 8787 数的划分
  10. JSON上