美文网首页OC-开发案例收集
iOS最简单的热修复实现

iOS最简单的热修复实现

作者: 江水东流 | 来源:发表于2022-03-29 11:36 被阅读0次

    github下载地址
    几百行代码就可以给我们项目加上热修复功能

    下面是一些实现好的热修方法,写好一些简单的js代码就可以实现热修复


    截屏2022-03-29 上午11.46.32.png

    热修复就是利用runtime方法交换,把从服务端下载下来的js热修代码转换成oc代码,修改或替换原来的方法实现, 可以在方法前 后插入代码,或者直接完全替换

    demo包含debug下本地调试,以及现网处理js资源完整逻辑, 只需要公司给你做个操作后台,上传写好的js代码,就可以实现热修复.

    如何写热修复?
    oc代码都可以热修,swift类里面类继承自NSObject 方法前缀有@objc dynamic的可以热修,可以用方法交换等api替换原来方法的实现来实现热修
    1 在Hotfix.js里面写热修复代码可以直接调试
    例子1: 卡片高度小于内容显示问题修复,方案: 替换获取高度方法,双列广告可以返回固定的.

    fixInstanceMethodReplace('MPFeedAdViewModel','cellHeight',function(instance, originInvocation, originArguments){
            //获取当前对象instance isRcmdCollectionType方法返回值,方法没有参数
        var isRcmdCollectionType = runInstanceWithNoParamter(instance,"isRcmdCollectionType")
    
        if (isRcmdCollectionType == true) {
            //值是true时候代表是双列广告, 返回固定值
            return 225
        } else  {
            //返回原来函数的返回值
            return runInvocation(originInvocation)
        }
    });
    

    fixInstanceMethodReplace 是方法替换,上面代码意思是把MPFeedAdViewModel类的对象方法cellHeight实现替换成下面的实现
    instance 是self,也是当前MPFeedAdViewModel对象, originInvocation是原来方法的实现, originArguments是方法参数,是个数组从0开始

    例子2: 我的作品样例文章方法少实现问题修复, 方案: 替换点击时候方法,没有实现对象方法调用另外一个跳转方法

    fixMethodReplace('MPMineWorksView', false, 'onCellClick:', function(instance, originInvocation, originArguments) {
        //获取参数对象model
        var model0 = originArguments[0]
        //判断是否是文章对象,发布中和样例文章是Article对象
        var isArticle = runInstanceMethod(model0, "isKindOfClass:", [runClassMethod("Article", "class", [])])
        if (isArticle) {
            var containerId = runInstanceMethod(model0, "containerId", [])
            var publishModel = runInstanceMethod(model0, "publishModel", [])
            if (publishModel != null) {
                var state = runInstanceMethod(publishModel, "state", [])
                if (state == 0 || state == 1) {
                    //发布中文章执行原来函数
                    runInvocation(originInvocation)
                } else {
                    runInstanceMethod(model0, "openContentWithContenterId:completion:", [containerId, null])
                }
            } else {
                 //样例文章调用原来跳转方法
                runInstanceMethod(model0, "openContentWithContenterId:completion:", [containerId, null])
            }
        } else {
            //内容跳转执行原来方法
            runInvocation(originInvocation)
        }
    });
    

    热修代码从js转成oc代码实现在 MPHotfix类里面
    2 测试好后
    创建版本号_main.js文件,比如7.2.0_main.js,
    把刚才写的热修复代码复制到这个文件(可以把7.2.0_main.js文件后缀改成.m,复制好代码后,再把后缀改成.js)
    把这个文件 7.2.0_main.js 右键 压缩成zip
    3 上传热修文件
    自己公司前端给一个上传zip文件生成地址的网页,zip拖拽上去后 拿到地址

    4 热修文件针对自己账号看是否生效
    https://biz.xxxxx.cn/chain 打开热修配置网址 (自己公司提供的热修复配置后台,更改后 可以修改app接口热修复配置返回数据)
    选择 app灰度配置
    在发布之前可以针对userId测试热修是否生效
    添加自己的现网用户id
    hf_zip_url 添加刚才导出的路径
    然后用自己手机看热修是否生效
    可以接口抓包看下发的hf_zip_url 地址是否对
    看 hf_zip_url 下发地址是否是你刚才填写的链接.

    如果同一个版本又加新的热修
    第一版是 7.2.0_main.js, 如果有升级热修文件 热修文件名main后面+1,比如: 7.2.0_main1.js. 新文件要包含原来的热修代码,自己新的热修代码写到下面

    相关文章

      网友评论

        本文标题:iOS最简单的热修复实现

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