本文贴出项目中热修复的代码片段:

require('UIView, JPObject, HtmlAllViewController,DataManager,EMClient,EaseMessageViewController')
defineClass("GHAcceptOrderViewController", {
tableView_willSelectRowAtIndexPath: function(tableView, indexPath) {
var row = indexPath.row();
var dataArr = self.sourceArr().toJS();
var vo = dataArr[row];
if (vo.type() == && vo.status() == ) {
return null;
}
return indexPath;
},
})
defineClass("HomePageViewController", {
clickIndex: function(index) {
var data = self.valueForKey("homeVO");
var dataArr = data.banners().toJS(); if (dataArr&&dataArr.length>index) {
var vo = dataArr[index];
if (vo.type()) {
if (vo.type() == ) { self.recharge();
}
}
if(vo.linkUrl()&&vo.linkUrl().length()>){ var ctrl = HtmlAllViewController.alloc().init();
var token = DataManager.getInstance().user().token();
var header = vo.linkUrl().toJS() + "?token=" + token.toJS(); ctrl.setValue_forKey(header,"mUrl");
ctrl.setValue_forKey(vo.name(),"mTitle");
self.navigationController().pushViewController_animated(ctrl,true);
}
}
},
onFloatImage: function(tap) {
var vo = DataManager.getInstance().user();
self.view().setUserInteractionEnabled(false); var weakSelf = __weak(self);
var success = block(function(){ weakSelf.view().setUserInteractionEnabled(true); var ctrl = EaseMessageViewController.alloc().initWithConversationChatter_conversationType("pinjian001",);
var dict = require("NSMutableDictionary").alloc().init();
dict.setObject_forKey("我", "senderName");
if(vo.avatar()){
dict.setObject_forKey(vo.avatar(), "senderAvatar");
}else{
dict.setObject_forKey("order_expert_desc_icon_bgImage.png", "senderAvatar");
}
dict.setObject_forKey("品简客服", "receiverName");
dict.setObject_forKey("doctor_defalt_icon.png", "receiverAvatar"); ctrl.setValue_forKey("咨询医生","title");
ctrl.setValue_forKey(dict,"pinjian"); weakSelf.navigationController().pushViewController_animated(ctrl,true);
}); var failure = block("EMError *", function(aError){
weakSelf.view().setUserInteractionEnabled(true);
}); EMClient.sharedClient().asyncLoginWithUsername_password_success_failure(vo.hxUsername(),vo.hxPassword(),success,failure); },
readMessage:function(notification){
self.tabBarItem().setBadgeValue(null);
self.showMessage(false);
},
})

需要特别说明的是:

1.oc里的属性访问在 js 这一定要通过.() 访问;

2.oc里的数据在 js 端调用,一定要通过 .toJS() 转换成 js数据类型;

3.oc里的block 在js 这端,如上方代码所示,特别注意下传参的格式;

4.oc里的block 在js端调用,必须要通过弱引用修饰,然后在block里用weakSelf,上方代码所示:

var weakSelf = __weak(self);

5.用到的头文件一定要require();

建议:先本地setupDevelopment 调试,调试成功后,多次检查无误后,再发布全局。

另外:关于jspatch 断点调试:https://github.com/bang590/JSPatch/wiki/JS-%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95

更多了解:

http://www.jianshu.com/p/0cb81bf23d7a

http://blog.cnbang.net/works/2767/

http://www.cnblogs.com/dsxniubility/p/5080875.html

http://jspatch.com/

JSPatch 动态更新,bug修复的更多相关文章

  1. JSPatch – 动态更新iOS APP

    原文:http://blog.cnbang.net/works/2767/ JSPatch是最近业余做的项目,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的 ...

  2. JSPatch动态更新APP

    JSPatch,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的原生接口,获得脚本语言的能力:动态更新APP,替换项目原生代码修复bug. 用途 是否有过这样 ...

  3. IOS App动态更新

    框架 JSPatch WaxPatch react-native   方案对比 目前已经有一些方案可以实现动态打补丁,例如WaxPatch,可以用Lua调用OC方法,相对于WaxPatch,JSPat ...

  4. RHSA-2017:2473-重要: 内核 安全和BUG修复更新(需要重启、存在EXP、本地提权)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  5. RHSA-2017:2029-中危: openssh 安全和BUG修复更新(存在EXP、代码执行、本地提权)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  6. RHSA-2017:2930-重要: 内核 安全和BUG修复更新(需要重启、存在EXP、本地提权、代码执行)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  7. RHSA-2017:2299-中危: NetworkManager 和 libnl3 安全和BUG修复更新(本地提权、代码执行)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  8. RHSA-2017:1842-重要: 内核 安全和BUG修复更新(需要重启、存在EXP、本地提权、代码执行)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  9. RHSA-2018:3032-低危: binutils 安全和BUG修复更新

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

随机推荐

  1. C语言调用库函数实现生产者消费者问题

    #include<stdio.h> #include<stdlib.h> #include<semaphore.h> #include<pthread.h&g ...

  2. 什么是FastCGI?

    什么是FastCGI? PHP的FastCGI使你的所有php应用软件通过mod_fastci运行,而不是mod_phpsusexec.FastCGI应用速度很快 是因为他们持久稳定.不必对每一个请求 ...

  3. 本人对于JavaScript的一些总结

    类型.值和变量 1.原始类型   数字.字符串和布尔   null空  undefined未定义 2.对象类型 3.类  Array  Function Date RegExp  Error 4.js ...

  4. WinForm实现窗体最小化后小图标在右边任务栏下

    一 基本功能1.  首先新建一个窗体,然后拖入一个名为 NotifyIcon 的控件,名字我没有改,就那个名字 2. 我的应用程序下有些图标文件,这里我用这个图标,我选择 013.ico 3. 选择 ...

  5. 读取本地文件理解FileReader对象的方法和事件以及上传按钮的美化。

    一.FileReader对象 用来把文件读入内存,并且读取文件中的数据.FileReader对象提供了异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据. 浏览器支持情况, ...

  6. 将整数数组按就分成2个部分,数组坐标为奇数,右边为偶数(java实现)

    方法1: 若不考虑性能: 使用一个新的数组target 遍历原数组 发现奇数则复制到target中 然后偶数 最后显示 import java.util.Arrays; public class Sp ...

  7. Long,String类型的两个值进行比较,注意点!!!

    一: . Long 类型指的是 java.util.Lang 对象,而不是基本类型 long (注意大小写)Java中如果使用 == 双等于比较对象,等于比较的是两个对象的内存地址,也就是比较两个对象 ...

  8. input type file onchange上传文件的过程中,遇到同一个文件二次上传无效的问题。

    不要采用删除当前input[type=file]这个节点,然后再重新创建dom这种方案,这样是不合理的.解释如下:input[type=file]使用的是onchange去做,onchange监听的为 ...

  9. RecyclerView不同类型Item的展示

    代码如下: public class AccessoiresAdapter extends RecyclerView.Adapter { final int VIEW_TYPE_ACCESSORY = ...

  10. Android Bitmap圆角

    代码如下: public Bitmap transform(Bitmap source) { int size = Math.min(source.getWidth(), source.getHeig ...