本文为转载文章 . 版权归原文所有。
前言
在iOS中有很多种热修复方案,在这里我就不一一介绍了
这里有一篇介绍热修复的文章:
iOS中的HotFix方案总结详解
我选择的热修复方案是JSPatch
我觉得JSPatch的优点有:
- 非侵入式
- 上手快
- 相关服务成熟
上代码
大神可以看重点,如果是和我一样的菜鸡就可以按照博客一步一步做,最后一定会成功让JSPatch跑起来的
第一步:创建Demo,在ViewController里添加一个Label,声明一个test方法来给Label.text赋值
OC:
![](http://upload-images.jianshu.io/upload_images/1298596-1aa07fb6ac35c856.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Swift:
![](http://upload-images.jianshu.io/upload_images/1298596-68c5c28526fad05f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
为了方便label就直接在StoryBoard里拖进来了(不喜欢拖控件的小伙伴可以用代码创建)
Swift中为每个变量和方法添加dynamic是保证Swift方法都可以被动态替换,这里涉及到Swift Runtime的知识就不详细讲述了按例贴一篇文章:
Swift Runtime分析:还像OC Runtime一样吗?
第二步:打开JSPatch网站下载SDK:http://jspatch.com/Index/sdk
![](http://upload-images.jianshu.io/upload_images/1298596-9c79a51cf7eabcd0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第三步:项目配置(这步稍微会有些复杂)
将解压后的SDK直接拖入工程中,然后在TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加 libz.dylib(或libz.tbd) 和 JavaScriptCore.framework。
![](http://upload-images.jianshu.io/upload_images/1298596-076943c322a1fcd1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1298596-a8a6afee5710724e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1298596-a9c874fcb7d672b7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在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/
![](http://upload-images.jianshu.io/upload_images/1298596-82d426a9d7baf5a6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
注册或登录
![](http://upload-images.jianshu.io/upload_images/1298596-cb001737b2342548.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
注册
第五步:创建你的App,名字可以随便写,AppID也可以不填
![](http://upload-images.jianshu.io/upload_images/1298596-149dc399db973a32.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1298596-1fee3c90c423837c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第六步:点击添加APP版本,创建一个App版本
![](http://upload-images.jianshu.io/upload_images/1298596-0acb44102601568e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1298596-bf62bd11eafe7334.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
介绍一下创建之后的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服务器上,
![](http://upload-images.jianshu.io/upload_images/1298596-aecd9f61db9c30ae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1298596-5191dbdde588cf92.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1298596-018d4422a8f8e621.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
选择文件选择刚刚创建的main.js (上传补丁的时候最少要有一个main.js 如果需要上传多个文件点击右侧加号就可以了)
一定先勾选开发预览,这样才能保证测试成功
一切都操作完之后选择提交
运行你的项目,如果命令行中显示以下内容就代表你的你的项目已经更新补丁了
![](http://upload-images.jianshu.io/upload_images/1298596-fe3448a829db28e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
因为补丁是先下载再生效的,所以下一次运行你才能看到效果
可以看到我的代码给label赋值为aaaa,通过JSPatch将label.text替换掉了
![](http://upload-images.jianshu.io/upload_images/1298596-449901535613471b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如果遇到什么问题可以留言给我,我会及时回复并更新博客内写的不足的地方
一些其他的资料:
可能遇到的坑
- JSPatch网站上的版本要一定要和工程里的一样
- label的名字别写错了..我顺手就给写成别的名字了
- Swift一定要在方法和属性前加dynamic,如果不是继承自NSObject的Swift类不能被动态替换
- Swift替换类和方法要比OC在类/方法名之前添加工程名
- 如果项目跑起来控制台输出没有找到文档就是网站上配置错了
基本使用姿势
发现bug->在项目里修复bug->将修改后的有问题的类和方法翻译成js并上传网站->发布补丁
8月27日补充
JS一定要加密,下面是方法截图和文档:
文档:http://jspatch.com/Docs/rsa
加密方法:
![](http://upload-images.jianshu.io/upload_images/1298596-8ac5cd31b6ad0550.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)