iOS 5分钟集成热修复(JSPatch)

前言

掘金3.5.2上线后发现了一个bug,我司iOS小哥上线前不当心改动了一部分代码,致使脏数据被缓存,取缓存的时候会致使项目崩溃...(苹果的审核愈来愈不认真了....好吧,我不推锅了,让我跪着写完这篇博客)..javascript

回归正题:

在iOS中有不少种热修复方案,在这里我就不一一介绍了java

这里有一篇掘金里介绍热修复的文章: iOS中的HotFix方案总结详解git

我选择的热修复方案是JSPatch 我以为JSPatch的优势有:github

  • 非侵入式
  • 上手快
  • 相关服务成熟

上代码

大神能够看重点,若是是和我同样的菜鸡就能够按照博客一步一步作,最后必定会成功让JSPatch跑起来的swift

第一步:建立Demo,在ViewController里添加一个Label,声明一个test方法来给Label.text赋值

OC:缓存

Swift:服务器

为了方便label就直接在StoryBoard里拖进来了(不喜欢拖控件的小伙伴能够用代码建立)app

Swift中为每一个变量和方法添加dynamic是保证Swift方法均可以被动态替换,这里涉及到Swift Runtime的知识就不详细讲述了按例贴一篇文章:jsp

Swift Runtime分析:还像OC Runtime同样吗?ide


第二步:打开JSPatch网站下载SDK:jspatch.com/Index/sdk


第三步:项目配置(这步稍微会有些复杂)

在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官网点击左上角注册 -> 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文档

iOS黑科技之不发版线上干掉bug(JSPatch)

Objective-C代码转换成JavaScript

可能遇到的坑

  • JSPatch网站上的版本要必定要和工程里的同样
  • label的名字别写错了..我顺手就给写成别的名字了
  • Swift必定要在方法和属性前加dynamic,若是不是继承自NSObject的Swift类不能被动态替换
  • Swift替换类和方法要比OC在类/方法名以前添加工程名
  • 若是项目跑起来控制台输出没有找到文档就是网站上配置错了
  • js上传的时候必定要加密,必定要加密,必定要加密

基本使用姿式

发现bug->在项目里修复bug->将修改后的有问题的类和方法翻译成js并上传网站->发布补丁

这一次的Bug实在是对不起各位用户老爷,让我跪着等到加急审核完毕,并利用此次学会的热修复技术来保证之后都不会让各位老爷遇到今天状况了...

8月27日补充

JS必定要加密,下面是方法截图和文档:

加密方法:

文档:jspatch.com/Docs/rsa

相关文章
相关标签/搜索