zoukankan      html  css  js  c++  java
  • 如何实现iOS热更新

    最近被苹果审核整怕了,每次提交版本都得等待一周到两周的审核时间,我是受不了这种速度了,于是决定研究有没有其他的方法跳过提交版本这个步骤,同样能够修复bug呢,于是我找到了JSPatch,也许也有很多人觉得这是个很高大上的技术,其实不然,我们只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。当然呢,目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。

    JSPatch的代码大家可以去github 上面下载

    首先说一下JsPatch实现的内部原理:JsPatch能做到通过JS调用和改写OC方法最根本的原因是 Objective-C 是动态语言,OC上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名和方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,还可以新注册一个类,为类添加方法。这里就不详细介绍runtime了,相关的资料我会在后续的博客里介绍,大家再等等吧。所以 JSPatch 的原理就是:JS传递字符串给OC,OC通过 Runtime 接口调用和替换OC方法。这个很容易理解,JS的作用只是一个信使的作用,具体实现还是得靠我们OC,所以说OC还是世界上最美的语言,哈哈。

    同时在这里给大家一个比较好的网站 点这里.这是一个OC转JS的一个工具网站。

    下面给大家演示一下具体实现的步骤

    - (void)viewDidLoad
    {
    
        UITableView* tv = [[UITableView alloc]initWithFrame:self.view.bounds
                                                     style:UITableViewStylePlain];
        self.mqTableView = tv;
        self.mqTableView.delegate = self;
        self.mqTableView.dataSource = self;
        [self.view addSubview:self.mqTableView];
    
    }
    #pragma mark -- UITableViewDataSource
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return 3;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString* i=  @"cell";
        UITableViewCell* cell = [tableView  dequeueReusableCellWithIdentifier:i];
        if (cell == nil ) {
            cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
                                        reuseIdentifier:i];
        }
        cell.textLabel.text = @"meiqing";
        cell.backgroundColor = [UIColor whiteColor];
        return cell;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        self.dataSource = @[@"1",@"2"];
        // 肯定会超出数组范围导致 crash
        NSString *content = self.dataSource[indexPath.row];
    
    }

    显示的结果是这样的


    屏幕快照 2015-12-10 上午12.09.15.png

    上面的图片是没有修改时候的显示,当我点击第三行一定会闪退,怎么修复呢?这个时候就不用发版本了,服务器可以给我们传送一个js文件,文件里的内容是这样的


    屏幕快照 2015-12-10 上午12.44.14.png

    同时,我们在APPDelegate里调用这个JS就可以了,如下:


    屏幕快照 2015-12-10 上午12.45.25.png

    再次运行就不会出现闪退了。
    整个流程下来其实挺简单的,希望大家能够接受,如果喜欢我的文章,可以关注我后续的文章。

    附带github demo

    微博账号:梅嘉庆(点击关注)



    文/梅庆(简书作者)
    原文链接:http://www.jianshu.com/p/8cec322531ae
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    【Python】在控制台输出不同颜色的文字
    【python】如何去掉使用BeautifulSoup读取html出现的警告UserWarning: You provided Unicode markup but also provided a value for from_encoding
    【nodejs】修改了下对股票表进行crud操作的代码
    【nodejs】用express又做了份crud
    day20_day23课堂笔记
    Myeclipse中java web.xml报错cvc-complex-type.2.3: Element 'web-app' cannot have character [children], because the type's content type is element- only.
    html中让input标签只读不可编辑的方法
    Win10锁屏壁纸位置在哪? 默认锁屏壁纸怎么提取?
    Potplayer怎么实现视频的镜面翻转?
    How to export Excel files in a Python/Django application
  • 原文地址:https://www.cnblogs.com/sunshine-liuxin/p/5472530.html
Copyright © 2011-2022 走看看