关于iOS 热更新(热修复)你必须知道的一种方法- JSPatch
本文为转载文章 . 版权归原文所有。
前言
在iOS中有很多种热修复方案,在这里我就不一一介绍了
这里有一篇介绍热修复的文章:
iOS中的HotFix方案总结详解
我选择的热修复方案是JSPatch
我觉得JSPatch的优点有:
- 非侵入式
- 上手快
- 相关服务成熟
上代码
大神可以看重点,如果是和我一样的菜鸡就可以按照博客一步一步做,最后一定会成功让JSPatch跑起来的
第一步:创建Demo,在ViewController里添加一个Label,声明一个test方法来给Label.text赋值
OC:

Swift:

为了方便label就直接在StoryBoard里拖进来了(不喜欢拖控件的小伙伴可以用代码创建)
Swift中为每个变量和方法添加dynamic是保证Swift方法都可以被动态替换,这里涉及到Swift Runtime的知识就不详细讲述了按例贴一篇文章:
Swift Runtime分析:还像OC Runtime一样吗?
第二步:打开JSPatch网站下载SDK:http://jspatch.com/Index/sdk

第三步:项目配置(这步稍微会有些复杂)
将解压后的SDK直接拖入工程中,然后在TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加 libz.dylib(或libz.tbd) 和 JavaScriptCore.framework。



在AppDelegate里写以下代码:
OC
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[JSPatch startWithAppKey:@"你的AppKey"]; //用来检测回调的状态,是更新或者是执行脚本之类的,相关信息,会打印在你的控制台
[JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) { }];
[JSPatch setupDevelopment]; [JSPatch sync]; return YES;
}Swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
JSPatch.startWithAppKey("你的Appkey")
JSPatch.setupCallback { (type, data, error) in
print(type)
print(data)
}
JSPatch.setupDevelopment()
JSPatch.sync()
return true
}
到这一步项目配置就完成了,下一步开始发补丁到项目中
第四步:打开JSPatch官网点击左上角注册 ->http://www.jspatch.com/
第五步:创建你的App,名字可以随便写,AppID也可以不填


第六步:点击添加APP版本,创建一个App版本


介绍一下创建之后的APP:
- appKey是之后在你项目中激活JSPatch要用到的
- 添加App版本 是按照你App的Version来创建的(如果version没写对会下载不到补丁)

第七步:创建一个main.js文件并在里面写上以下代码:
OC
defineClass('ViewController', {
test : function() {
self.label().setText("label的text被改掉了");
},
})Swift
defineClass('HotFixDemo.ViewController', {
test : function() {
self.label().setText("label的text被改掉了");
},
})
Swift覆盖方法和类的时候要加上项目名,所以规范应该是 项目名.类名(方法名) 注册类的时候也要加上项目名
第八步:点击刚刚创建的1.0,将保存好的JS上传到JSPatch服务器上,



选择文件选择刚刚创建的main.js (上传补丁的时候最少要有一个main.js 如果需要上传多个文件点击右侧加号就可以了)
一定先勾选开发预览,这样才能保证测试成功
一切都操作完之后选择提交
运行你的项目,如果命令行中显示以下内容就代表你的你的项目已经更新补丁了

因为补丁是先下载再生效的,所以下一次运行你才能看到效果
可以看到我的代码给label赋值为aaaa,通过JSPatch将label.text替换掉了

如果遇到什么问题可以留言给我,我会及时回复并更新博客内写的不足的地方
一些其他的资料:
可能遇到的坑
- JSPatch网站上的版本要一定要和工程里的一样
- label的名字别写错了..我顺手就给写成别的名字了
- Swift一定要在方法和属性前加dynamic,如果不是继承自NSObject的Swift类不能被动态替换
- Swift替换类和方法要比OC在类/方法名之前添加工程名
- 如果项目跑起来控制台输出没有找到文档就是网站上配置错了
基本使用姿势
发现bug->在项目里修复bug->将修改后的有问题的类和方法翻译成js并上传网站->发布补丁
8月27日补充
JS一定要加密,下面是方法截图和文档:
文档:http://jspatch.com/Docs/rsa
加密方法:

关于iOS 热更新(热修复)你必须知道的一种方法- JSPatch的更多相关文章
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 热更新Live2D
live2D是一个很强大的2D动画组件.我们可以使用AS3脚本对它进行热更新. live2D在Unity中的使用请看这里: 如何获取Live2D 总得来说,我们可以先去live2D官网下载它的Unit ...
- Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法
时隔一个多月我又回来啦! 坚持真的是很难的一件事,其它事情稍忙,就很容易说服自己把写博客的计划给推迟了. 好在终于克服了自己的惰性,今天又开始了. 本篇继续我的Luaframework学习之路. 一. ...
- Unity热更新之C#反射动态获取类属性及方法
如果我们要为发布出去的游戏更新一些功能,但又不想让用户重新下载整个游戏包,只让他下载我们更新的资源包,用assetBundle打包资源的方式是可以的,但其中有个最大的例外,那就是脚本. 虽然asset ...
- 从 Yum 更新中排除特定/某些包的三种方法
方法 1:手动或临时用 yum 命令排除包 要排除单个包: # yum update --exclude=kernel 或者 # yum update -x 'kernel' 要排除多个包.以下命令将 ...
- ios开发——实用技术OC篇》倒计时实现的两种方法
倒计时实现的两种方法 timeFireMethod函数,timeFireMethod进行倒计时的一些操作,完成时把timer给invalidate掉就ok了,代码如下: secondsCountDow ...
- 【转】: 《江湖X》开发笔谈 - 热更新框架
前言 大家好,我们这期继续借着我们工作室正在运营的在线游戏<江湖X>来谈一下热更新机制以及我们的理解和解决方案.这里先简单的介绍一下热更新的概念,熟悉这部分的朋友可以跳过,直接看我们的方案 ...
- Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...
- 安卓热更新之Nuwa实现步骤
安卓热更新之Nuwa实现步骤 最近热更新热修复的功能在安卓应用上越发火热,终于我的产品也提出了相应的需求. 经过两天的研究,搞定了这个功能,在这里还要多谢大神们的博客,大神们的原理分析很到位,不过对于 ...
随机推荐
- easyui中使用的遮罩层
easyui 的 dialog 是继承自 window的,而 window中有modal这样的属性(见参考资料),就是用于打开模态的窗口的,也就是你说的有遮罩层的窗口.所以不需要额外的代码,仅需在di ...
- 最近在研究FFmpeg编解码
好几年没上CNBLOGS了, 最近在研究FFmpeg编解码,一个人研究感到很寂寞,所以想通过博客来和大家分享和交流,呵呵. 最近研究的主题是: ANDROID手机同屏技术: 需要用到ANDROID截屏 ...
- iOS:UITableView表格视图控件
UITableView:表格视图控件,继承滚动视图控件UIScrollView,(类似于UIPickerView选择器,它主要通过设置数据源代理和行为代理实现协议来设置单元格) 对表格的操作主要 ...
- Redhat Linux FTP配置
文件传输协议(FTP:FileTransfer Protocol)使得主机间可以共享文件. FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输.控制连接 ...
- 混沌数学之Lorenz(洛伦茨)吸引子
洛伦茨吸引子是洛伦茨振子(Lorenz oscillator)的长期行为对应的分形结构,以爱德华·诺顿·洛伦茨的姓氏命名. 洛伦茨振子是能产生混沌流的三维动力系统,是一种吸引子,以其双纽线形状而著称. ...
- 【转载】关于大数据库的一些不错的GitHub项目
优秀大数据GitHub项目一览 http://blog.csdn.net/YaoXTao/article/details/50540485
- Informatica 常用组件Filter之一 概述
转换类型:已连接.主动 过滤器转换允许您过滤映射中的行.通过过滤器转换从源转换传递所有的行,然后为转换输入过滤条件.所有过滤器转换中的端口均为输入/输出端口,只有符合条件的行才能通过过滤器转换. 在某 ...
- Java JDBC数据库链接
好久没有编写有关数据库应用程序啦,这里回顾一下java JDBC. 1.使用Java JDBC操作数据库一般需要6步: (1)建立JDBC桥接器,加载数据库驱动: (2)连接数据库,获得Connect ...
- [leetcode]Construct Binary Tree from Preorder and Inorder Traversal @ Python
原题地址:http://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 题意:根 ...
- Linux上如何查看Deb和RPM软件包的更新日志
导读 当一个程序或库打包成Deb或RPM软件包后会有一些元数据文件包含在其中,其中之一就是 changelog文件,它记录了软件包每次更新后发生了什么变化.因此,如果你想找出你安装或更新的软件包发生了 ...
