iOS开发那些事儿(二)热补丁
一.热补丁作用:修复导致崩溃的错误、替换/增加方法、替换原来的界面等等
二.实现手段:JSPatch (使用Objective-C Objective-C和JavaScript jspatch桥。你可以调用任何Objective-C类和方法在JavaScript中的只是其中一小发动机。这使应用程序获取脚本语言的力量:添加模块或更换Objective-C代码来修复漏洞动态)。传送门:https://github.com/agelessman/JSPatch
三.Demo:
- JSPatch导入:拷贝
JSEngine.m、JSEngine.h、JSPatch.js到工程。添加依赖库 JavaScriptCore.framework - 实现部分:
- 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 });
- APPDelegate中的实现策略如下:
四.实现原理:
- 基础原理:能做到通过 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开发那些事儿(二)热补丁的更多相关文章
- iOS开发-定制多样式二维码
iOS开发-定制多样式二维码 二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常 ...
- IOS开发-文件管理(二)
IOS开发-文件管理(二) 五.Plist文件 String方式添加 NSString *path = [NSHomeDirectory( ) stringByAppen ...
- 【Swift】iOS开发历险记(二)
前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯 ...
- 【Swift】iOS开发笔记(二)
前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯 ...
- iOS开发那些事儿(六)Git分之策略
git 分支策略 将要介绍的这个模型不会比任何一套流程内容多,每个团队成员都必须遵守,这样便于管理软件开发过程. 既分散又集中 我们使用的,且与这个分支模型配合的非常好的库,他有一个“真正”的中央仓库 ...
- ios开发runtime学习二:runtime交换方法
#import "ViewController.h" /* Runtime(交换方法):主要想修改系统的方法实现 需求: 比如说有一个项目,已经开发了2年,忽然项目负责人添加一个功 ...
- iOS开发——高级篇——二维码的生产和读取
一.二维码的生成 从iOS7开始集成了二维码的生成和读取功能此前被广泛使用的zbarsdk目前不支持64位处理器 生成二维码的步骤:导入CoreImage框架通过滤镜CIFilter生成二维码 二维码 ...
- iOS开发之生成二维码
一.二维码的生成 从iOS7开始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk目前不支持64位处理器 1.二维码的内容(传统的条形码只能放数字) 纯文本 名片 URL 2.生成二 ...
- 从零开始学ios开发(十二):Table Views(上)
这次学习的控件非常重要且非常强大,是ios应用中使用率非常高的一个控件,可以说几乎每个app都会使用到它,它就是功能异常强大的Table Views.可以打开你的iphone中的phone.Messa ...
随机推荐
- 自制证书搭建https服务
第一步,自制CA证书和Server证书,私钥 自制CA私钥 openssl genrsa -des3 -out ca.key 4096 自制CA证书 openssl req -new -x509 -d ...
- Hibernate问题之'hibernate.dialect' not set
继前文:Hibernate4中buildSessionFactory方法废弃问题.后 继续有问题.本来之前好好的项目,用了这种新的方法后发现问题. 出现 Connection cannot be n ...
- 《Effective C++》:条款46-条款47
条款46请输入转换的时候,需要定义非模板成员函数 条款47请使用traits class表现类型信息 条款46:须要类型转换时请为模板定义非成员函数 条款 24提到过为什么non-member函数才有 ...
- 【巧妙】【3-21个人赛】Problem C 01串
Problem C Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Sub ...
- ab -n -c
ab是apache自带的一个很好用的压力测试工具,当安装完apache的时候,就可以在bin下面找到ab 1 我们可以模拟100个并发用户,对一个页面发送1000个请求 ./ab -n1000 -c1 ...
- C# Web对文件的管理
/// <summary> /// 创建新文件 /// </summary> /// <param name="parentPath">文件路径 ...
- Import MySQL Dumpfile, SQL Datafile Into My Database
How can I import a MySQL dumpfile into my database? I'm using CentOS Linux 5 server. My old hosting ...
- 表格(table) 插件:支持当前行增行、删除。使用事件委托
最近做一个项目,需要对表格进行增行和删行. 研究了一下jquery操作dom的方法和事件委托原理,下面是我编写的例子,源码传上,欢迎高手指点. 功能: 支持在指定行下面增行: 支持删行指定行: 增行. ...
- css动画,css过度,js动画
1jQuery动画 语法a$(selector).animate(styles,options) 语法b$(selector).animate(styles,speed,easing,callback ...
- PHP多线程的实现方法详解
PHP5中可以使用新增的stream_socket_client()函数直接替换掉fsocketopen().PHP5之前的版本,你需要自己动手,用sockets扩展解决问题.PHP5的先进之处在于, ...