博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发那些事儿(二)热补丁
阅读量:7296 次
发布时间:2019-06-30

本文共 2601 字,大约阅读时间需要 8 分钟。


一.热补丁作用:修复导致崩溃的错误、替换/增加方法、替换原来的界面等等


 

二.实现手段:JSPatch (使用Objective-C Objective-C和JavaScript jspatch桥。你可以调用任何Objective-C类和方法在JavaScript中的只是其中一小发动机。这使应用程序获取脚本语言的力量:添加模块或更换Objective-C代码来修复漏洞动态)。传送门:https://github.com/agelessman/JSPatch


 

三.Demo

  1. JSPatch导入:拷贝 JSEngine.m 、JSEngine.h 、JSPatch.js到工程。添加依赖库 JavaScriptCore.framework
  2. 实现部分:
    • APPDelegate中的实现策略如下:
      1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2      3     /** 这里热更新的实现思路:info.plist记录一个当前的版本号,每次程序开启的时候都去后台获取当前最新的版本号。拿这个最新版本号与本地的版本号比对,如果匹配成功---->不进行任何操作;如果匹配失败---->下载js文件进行热更新 */ 4      5     //1.开启JP引擎 6     [JPEngine startEngine]; 7      8     //2.js文件路径 9     NSString * jsPath = [[NSBundle mainBundle] pathForResource:JSName10                                                         ofType:@"js"];11     12     //3.设置编码格式13     NSString * script = [NSString stringWithContentsOfFile:jsPath14  encoding:NSUTF8StringEncoding 15  error:nil]; 16 17 //4.热更新 18  [JPEngine evaluateScript:script]; 19 20 self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; 21 22  [self.window addSubview:[self genView]]; 23 24 self.window.rootViewController = [[ViewController alloc]init]; 25 26  [self.window makeKeyAndVisible]; 27 28 return YES; 29 }

       
      1 /** 创建一个View到当页面,我们的目标利用js文件来动态修改这个方法 */2 -(UIView *)genView3 {4     UIView * newView        = [[UIView alloc]initWithFrame:CGRectMake(0, 0,KDeviceWidth,KDeviceHeight)];5     newView.backgroundColor = [UIColor grayColor];6     return newView;7 }

       
    • 编写JS文件:
      1 // demo.js 2 require('UIView, UIColor, UILabel') 3 defineClass('AppDelegate', { 4   // 替换这个 -genView 方法 5   genView: function() { 6     var view = self.ORIGgenView();                           7     view.setBackgroundColor(UIColor.greenColor())             //修改背景色 8     var label = UILabel.alloc().initWithFrame(view.frame()); //创建一个label 9 label.setText("JSPatch"); 10 label.setTextAlignment(1); 11  view.addSubview(label); 12 return view; 13  } 14 });


四.实现原理:

  • 基础原理能做到通过 JS 调用和改写 OC 方法最根本的原因是 Objective-C 是动态语言,OC 上所有方法的调用 / 类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名 / 方法名反射得到相应的类和方法(runtime入门教程传送门:http://blog.csdn.net/lizhongfu2013/article/details/9496705 )p.s:runtime是Objective-C的重要部分,如果想进阶中高阶iOS程序猿runtime理论必须要掌握。会与不会真的两个境界!!
  • 底层原理:传送门:http://blog.cnbang.net/tech/2808/ p.s:建议大概了解下runtime接口再仔细阅读这篇博客,真心赞

 


五.弊端:

  • JS文件是在网络上传递需要考虑安全性。如果在传输过程中被别人截获并篡改的话,这对APP的安全性以及保密性的伤害可想而知。
    • 解决方式:加密、Https让js文件以密文或者更安全的链路传递
  • JS文件一般偷摸下载之后会保存到本地文件。如果用户越狱之后可以用一个叫filelBox(大概是一个)的软件可以读写沙盒中的文件。从而影响APP的稳定性
    • 解决方式:本地下载之后存储也需要加密,不要明文的形式展示

转载于:https://www.cnblogs.com/conorBlogs/p/5258514.html

你可能感兴趣的文章
监督学习——AdaBoost元算法提高分类性能
查看>>
通过ASP.NET Ajax技术模拟实现NBA比赛文字直播功能
查看>>
[数学建模(三)]遗传算法与旅行商问题
查看>>
Linux上文件恢复工具
查看>>
关于开发环境无法运行applet
查看>>
9 完整的用户注册登录实例
查看>>
1.AJAX简介
查看>>
MVC5-3 Result分析
查看>>
记SpannableString设多少span时注意事项
查看>>
iOS8.1 To iOS8.2
查看>>
C#中让窗体自动靠边隐藏
查看>>
多态基类的析构函数应该为虚函数
查看>>
数据结构之 循环表线性表
查看>>
python 实现进制转换(二进制转十进制)
查看>>
Scrum立会报告+燃尽图(十二月九日总第四十次):视频剪辑与用户反馈
查看>>
xlst
查看>>
修改PHP上传文件的大小限制(post)
查看>>
Tengine 添加第三方监控模块nginx-module-vts
查看>>
黑马程序员-面向对象-09天-4
查看>>
小强的HTML5移动开发之路(14)——Video标签详解
查看>>