iOS开发那些事儿(一)热补丁



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



二.实现手段: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的稳定性
    • 解决方式:本地下载之后存储也需要加密,不要明文的形式展示
时间: 2024-12-18 20:58:06

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

iOS开发那些事儿(五)Objective-C浅拷贝与深拷贝

浅拷贝:copy操作出来的对象指针直接指向模板的地址.即两个对象公用一块内存地址 1 #import <Foundation/Foundation.h> 2 int main(int argc, const char * argv[]) { 3 @autoreleasepool { 4 NSString * testStr = @"connor"; 5 NSLog(@"testStr's Address = %p",testStr); 6 7 NSStr

iOS开发那些事儿(一)轮播器

前言 市面上绝大部分的APP被打开之后映入眼帘的都是一个美轮美奂的轮播器,所以能做出一个符合需求.高效的轮播器成为了一个程序员的必备技能.所以今天的这篇博客就来谈谈轮播器这个看似简单的控件其中蕴含的道理. 正文  首先我们来分析一下该如何去实现一个类似下图的轮播器(图片数量.URL由服务器返回):   策略一:UIScrollView->UIImageView->NSTimer轮询 这算是常规的策略,但是如果仔细想想,如果服务器返回给你50图片是不是就需要创建50个UIImageView来做容

iOS开发那些事儿(四)the dark arts of the Objective-C runtime

一."Black Magic":Method Swizzling 利用 Runtime 特性把一个方法的实现与另一个方法的实现进行替换,也可以用runtime的四维理解——修改Dispatch Table让一个方法的IMP对应到我们指定的IMP上去 二.实例说明:比如我们想要在APP中记录每一个ViewController的出现次数 三.实例分析: 第一种思路就是在ViewController出现的一瞬间(viewDidAppear)我就用记录工具记录一条日志. 1 @implemen

iOS开发那些事儿(三)外部通知

一.外部通知使用场景:假如你想要用某宝上的一个商品分享给朋友,你想这个物品的URL分享给你的好友.之后你的好友点击开此URL,如果在装了某宝的情况下,iPhone会自动跳转到某宝 二.实现步骤: 自定义URL模式 响应URL请求 三.Demo: 在项目的info.plist添加如下: ?  (p.s 注意层级) 现在得到的就是自定义URL模式.可以通过调用cornorDemo://*********来打开自己的应用 2.   响应URL请求 APPDelegate.m中的- (BOOL)appl

iOS开发那些事儿(三)JsonKit解析原理

json_parse_it :开始解析,字符串指针从头到尾循环 jk_parse_next_token:获取下个字符的type和length 大部分分隔符长度都是固定1 jk_parse_string:循环移动指针直到结束符号,获取字符串长度 jk_parse_number:获取数字的长度 jk_object_for_token:获取这个节点(type,长度) 判断type jk_cachedObjects:获取string对象 jk_cachedObjects:获取number对象 jk_pa

总结iOS开发中的断点续传那些事儿

前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很浪费时间有木有.所以呢,项目中实现大文件下载的时候,断点续传功能是必不可少了.当然咯,断点续传有一种特殊的情况,就是我们的应用呗用户kill掉或者应用crash,要实现应用重启之后的断点续传,这种情况就是我们将要解决的问题. 断点续传的原理 要实现断点续传,服务器必须是要支持的.目前最常见的两种方式

ios开发不能不知的动态修复bug补丁第三方库JSPatch 使用学习:JSPatch导入、和使用、.js文件传输加解密

JSPatch ios开发面临审核周期长,修复bug延迟等让人无奈的问题,所以,热修复的产生成为必然. ios上线APP产生bug,需要及时修复,如何修复: 我整理了jspatch的使用说明,并建立一个简单demo供他人使用和学习,此博客不做详细介绍,具体如何使用附上代码地址: 代码下载地址: https://github.com/niexiaobo/JSPatchUse ##### demo.js里添加代码:1.重写crashBtnClick方法 2.跳转新建的JPTableViewContr

基于自适应热补丁的Android内核漏洞生态修复方案

1. 背景 Android内核漏洞严重影响了Android平台的安全.一旦内核被攻破,所有依赖内核完整性的安全机制都岌岌可危(比如加密.进程隔离.支付.指纹验证等).作为Android平台最后的防线,TrustZone也会受到威胁,因为内核可以从很多被信任的接口向TrustZone发起攻击.因此,理想情况下Android生态圈应该及时消灭内核漏洞.然而从Google的Android Security Bulletin上看,Android内核漏洞的数量呈飞快上涨的趋势(Figure 1所示).虽然

【腾讯bugly干货分享】微信Android热补丁实践演进之路

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1264&extra=page%3D1 继插件化后,热补丁技术在2015年开始爆发,目前已经是非常热门的Android开发技术.其中比较著名的有淘宝的Dexposed.支付宝的AndFix以及QZone的超级热补丁方案.微信对热补丁技术的研究并不算早,大约开始于2015年6月.经过研究与尝试现有的各个方案,我们发现它