关于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实现步骤 最近热更新热修复的功能在安卓应用上越发火热,终于我的产品也提出了相应的需求. 经过两天的研究,搞定了这个功能,在这里还要多谢大神们的博客,大神们的原理分析很到位,不过对于 ...
随机推荐
- Oracle数据库中违反唯一约束的处理
根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知.根据这个定义,多个NULL值的存在应该不违反唯一约束. 实际上Oracle也是如此实现的: SQ ...
- jquery、js获取table,遍历输出tr中各个td的内容。
首先,依赖jquery.. $('#btntb').click(function(){ $('#tab tr').each(function(i){ // 遍历 tr $(this).children ...
- easyui datatimebox 取值和赋值
1.取值 var time = $('.easyui-datetimebox').datetimebox('getValue'); 全部代码如下: <script type="text ...
- 【Burnside定理】&【Pólya定理】
Burnside & Pólya (详细内容请参阅<组合数学>或2008年cyx的论文,这里只写一些我学习的时候理解困难的几个点,觉得我SB的请轻鄙视……如果有觉得不科学的地方欢迎 ...
- Java基础(三):修饰符、运算符、循环结构和分支结构
一.Java修饰符: Java语言提供了很多修饰符,主要分为以下两类:访问修饰符和非访问修饰符.修饰符用来定义类.方法或者变量,通常放在语句的最前端. 1.访问控制修饰符: Java中,可以使用访问控 ...
- Android -- VelocityTracker
VelocityTracker 主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出当前的速度. 方法 //获取一个VelocityTracker对象, 用完 ...
- Medication Reconciliation Overview
http://www.hcsinc.net/HCS-Medication-Reconciliation/med-rec-overview.html At HCS, we've worked with ...
- Mac Finder中如何复制当前完整路径
1.拖到命令行 2.在Finder中command+i 会弹出详细信息,然后[位置]处进行 copy 3.利用Automator,添加一个服务的快捷键. 转自:http://q.cnblogs.com ...
- Windows 抓取本地环路包
1.cmd,ipconfig查看自己的ip地址. 2.执行命令:route add 10.36.65.89 mask 255.255.255.255 10.36.65.1 metric 1,其中10. ...
- sse float 转int 截断和不截断
之前, 我用sse指令, 想把float 型转成int, 不过其中遇到了一些困惑,就是截断和不截断的问题, 这个问题一直困扰我好集体, 最后终于解决了, 原来sse本身就有截断和不截断的指令. _mm ...
