美文网首页iOS开发程序员iOS实战
iOS 5分钟集成热修复(JSPatch)

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

作者: 轩辕小羽 | 来源:发表于2016-08-27 09:31 被阅读3056次

    前言

    在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文档

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

    Objective-C代码转换成JavaScript

    可能遇到的坑

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

    基本使用姿势

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

    8月27日补充

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

    文档:http://jspatch.com/Docs/rsa

    加密方法:


    相关文章

      网友评论

      • f29da6214cb5:亲,请问一下,JSPatch可以用在企业版的APP上吗?我按照你说的做,我发布补丁以后,我什么发布成功的个数还是0呢?
      • 须佐能乎:”更新补丁出错: 解密 MD5 文件失败, 已重试次数: 1“ 这是为什么?
        饭特惜:遇到同样的问题,密钥是按文档生成的,公钥写在项目里,用\n换行;私钥和补丁一起提交。
        然而一直出现和10楼一样的问题,@须佐能乎,找到原因了吗?
        轩辕小羽:@须佐能乎 秘钥问题?
      • 2c493acbc479:你写的这个是收费的对吗?我们公司的用户量肯定上1w了,难道QQ微信微博支付宝都用的是这个SDK吗?
      • 雪_晟:大哥,xcode 怎么创建main.js文件啊,正在搞这个
        luseike:@miss李manman 创建一个空文件,自己取个名字就行,比如main.js
      • 思念那年慕云:注意:这里的版本要填写一致,构建版本(build)一定要大于等于APP版本,不然也不会成功。
      • 假城:这位大哥,有个疑惑您别见怪,您是怎么给xcode编码区弄成图片背景的,看着挺好的 :hushed:
        假城:@轩辕小羽 哦 原来是插件 恩恩 多谢指点:yum:
        轩辕小羽:@假城 xfun 插件
      • NSLogName:按照您的方法,下发成功了但是没有替换成功(label的文字),这个怎么解决啊?求教
        轩辕小羽:@NSLogName 嗯嗯
        NSLogName:@轩辕小羽 已经解决了,我没有用故事板,重定义了一个RootVc,总之就是代码顺序弄反了,改一下就好了。
        轩辕小羽:@NSLogName 控制台有输出吗,如果成功的话应该是第二回才有效果
      • 十一岁的加重:好文章,项目实战,有图有真相

      本文标题:iOS 5分钟集成热修复(JSPatch)

      本文链接:https://www.haomeiwen.com/subject/xwozsttx.html