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

iOS 通过 JSPatch 实时修复线上 bug!的更多相关文章

  1. 修复线上bug

    1,git branch new_branch 2,git push origin new_branch 以上是线上地址操作,以下是本地仓库操作 3,git fetch 4,git checkout ...

  2. 价值100W的经验分享: 基于JSPatch的iOS应用线上Bug的即时修复方案,附源码.

    限于iOS AppStore的审核机制,一些新的功能的添加或者bug的修复,想做些节日专属的活动等,几乎都是不太可能的.从已有的经验来看,也是有了一些比较常用的解决方案.本文先是会简单说明对比大部分方 ...

  3. ios开发不能不知的动态修复bug补丁第三方库JSPatch 使用学习:JSPatch导入、和使用、.js文件传输加解密

    JSPatch ios开发不能不知的动态修复bug补丁第三方库JSPatch 使用学习:JSPatch导入.和使用..js文件传输加解密 ios开发面临审核周期长,修复bug延迟等让人无奈的问题,所以 ...

  4. iOS - 选取相册中iCloud云上图片和视频的处理

    关于iOS选取相册中iCloud云上图片和视频  推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...

  5. 微信公众号弹出框在IOS最新系统中点击键盘上的“完成”导致事件无法触发问题

    微信公众号弹出框在IOS最新系统中点击键盘上的"完成"导致事件无法触发问题 问题描述 微信公众号中有项功能是弹框模态框,输入信息后保存操作.但是在IOS系统中发现,当输入内容后,点 ...

  6. 怎么解决前端线上Bug

    有一种八阿哥(Bug),叫"在我电脑上是好的呀". 有一种解决方式,叫"你去好好排查一下你自己的代码". 有一种控诉,叫"这绝不是后端的问题" ...

  7. 线上bug或故障界定及填写规范

    [线上故障与线上Bug界定] 一.线上故障: 1.  故障参照公司规范稍做调整: a)         1级故障:资讯首页或主App首页无法打开:多条业务线同时不可用:超过15分钟: b)       ...

  8. 线上bug的解决方案--带来的全新架构设计

    缘由 本人从事游戏开发很多年一直都是游戏服务器端开发. 因为个人原因吧,一直在小型公司,或者叫创业型团队工作吧.这样的环境下不得不逼迫我需要什么都会,什么做. 但是自我感觉好像什么都不精通..... ...

  9. iOS开发网络篇—文件的上传

    iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代 ...

随机推荐

  1. C++之路进阶——codevs2933(诗人小G)

    2933 诗人小G 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 小G是一个出色的诗人 ...

  2. ZOJ 1015 Fishing Net(弦图判定)

    In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...

  3. 前端里神奇的BFC 原理剖析

    以前在做自适应两栏布局的时候别人口中听到bfc这个词,于是看了各种关于bfc的文章,发现梦想天空介绍的不错,今天就在他的基础上润色一下. 一.BFC是什么? 在解释 BFC 是什么之前,需要先介绍 B ...

  4. AJAX-----14HTML5中新增的API---files

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. runoob

    今天学习bootstrap的时候偶然发现http://www.runoob.com/ 这个网站不错,比w3cschool界面要好看,内容要丰富 比较适合新手学习,而且上面的内容比较丰富,不错.

  6. 【转】Struts1.x系列教程(5):HTML标签库

    转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/archive/2009/01/archive/2009/0 ...

  7. ArrayList代码示例

    package com.shushine.framework.第七章Java标准类库;import java.util.ArrayList;/** * * <p> * 描述该类情况 {@l ...

  8. faster alter table add column

    Create a new table (using the structure of the current table) with the new column(s) included. execu ...

  9. 删除DSO Change Log表数据

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. redis参数与持久化原理

    [root@JR hx]# redis-cli info # Server redis_version:2.8.19 redis_git_sha1:00000000 redis_git_dirty:0 ...