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


二.实现手段: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:JSName
      10 ofType:@"js"];
      11
      12 //3.设置编码格式
      13 NSString * script = [NSString stringWithContentsOfFile:jsPath
      14 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 *)genView
      3 {
      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的稳定性
    • 解决方式:本地下载之后存储也需要加密,不要明文的形式展示

iOS开发那些事儿(二)热补丁的更多相关文章

  1. iOS开发-定制多样式二维码

    iOS开发-定制多样式二维码   二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常 ...

  2. IOS开发-文件管理(二)

    IOS开发-文件管理(二) 五.Plist文件 String方式添加               NSString *path = [NSHomeDirectory( )  stringByAppen ...

  3. 【Swift】iOS开发历险记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  4. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  5. iOS开发那些事儿(六)Git分之策略

    git 分支策略 将要介绍的这个模型不会比任何一套流程内容多,每个团队成员都必须遵守,这样便于管理软件开发过程. 既分散又集中 我们使用的,且与这个分支模型配合的非常好的库,他有一个“真正”的中央仓库 ...

  6. ios开发runtime学习二:runtime交换方法

    #import "ViewController.h" /* Runtime(交换方法):主要想修改系统的方法实现 需求: 比如说有一个项目,已经开发了2年,忽然项目负责人添加一个功 ...

  7. iOS开发——高级篇——二维码的生产和读取

    一.二维码的生成 从iOS7开始集成了二维码的生成和读取功能此前被广泛使用的zbarsdk目前不支持64位处理器 生成二维码的步骤:导入CoreImage框架通过滤镜CIFilter生成二维码 二维码 ...

  8. iOS开发之生成二维码

    一.二维码的生成 从iOS7开始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk目前不支持64位处理器   1.二维码的内容(传统的条形码只能放数字) 纯文本 名片 URL   2.生成二 ...

  9. 从零开始学ios开发(十二):Table Views(上)

    这次学习的控件非常重要且非常强大,是ios应用中使用率非常高的一个控件,可以说几乎每个app都会使用到它,它就是功能异常强大的Table Views.可以打开你的iphone中的phone.Messa ...

随机推荐

  1. jquery.tablesorter.js 学习笔记

    jquery.tablesorter.js 一般情况下,表格数据的排序方式有两种,第一种是让后端服务将排序后的数据直接输出,另外一种方式就是使用客户端排序,而jquery.tablesorter.js ...

  2. hdu 5569 matrix(简单dp)

    Problem Description Given a matrix with n rows and m columns ( n+m ,) and you want to go to the numb ...

  3. MySQL之终端(Terminal)管理数据库、数据表、数据的基本操作(转)

    MySQL有很多的可视化管理工具,比如“mysql-workbench”和“sequel-pro-”. 现在我写MySQL的终端命令操作的文章,是想强化一下自己对于MySQL的理解,总会比使用图形化的 ...

  4. 【巧妙】【3-21个人赛】Problem C 01串

    Problem C Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Sub ...

  5. 只获取linux ip的命令

    ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

  6. CSS3阴影 box-shadow的使用

      text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[ins ...

  7. HTML6注册表单输入日志标题

    一.找到元素. var d = document.getElementById("") var d = document.getElementsByName("" ...

  8. 实现Jquery触发一事件后,停留5秒,再接着触发下面的事件

    这里是一个广告位的Jquery的代码,有两个不同的广告位,一个是中间浮动显示的,显示5秒后自动消失,并限定每天仅出现一次(Cookie实现): //=====================广告位的j ...

  9. eclipse 使用maven 创建springmvc + mybatis

    接着eclipse 使用maven 创建纯spring mvc项目 毕竟项目都要访问数据库的, 所以加上mybatis的支持也就是网上大多时候说的 SSM框架的搭建(Spring + Spring M ...

  10. Android.Hack.02_Animations

    #01# TextView 和 ImageView TextView和Imageview切换卡顿,为了实现更好的切换,可以用动画来实现,系统自带的TextViewSwitcher 和ImageView ...