在学习的道路上永远向大神们看齐
JSPatch的强大对于每一个iOS开发人员来说可谓耳熟能详了,可是我现在才能抽空来学习这么牛逼的技术
下面的文章只是我学习的笔记,如对其他原作有影响的话请见谅
bang的GitHub的原作已经详细的介绍了JSPatch的基本使用和实现原理,大神对此是开源的,这不仅让我感叹一句,bang真是一点都不吝啬自己才华的大神,恩,前进的动力啊
学习链接:
https://github.com/bang590/JSPatch
http://albert43.net/2015/07/12/JSPatch总结/
http://bang590.github.io/JSPatchConvertor/
https://github.com/bang590/JSPatch/wiki/JS-断点调试
检查脚本语言有没有书写正确
http://jsbin.com/?js,output
JSPacth 是什么,是用来干嘛的??
JSPatch 是一个 iOS 动态更新框架,只需在项目中引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 原生接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原生代码动态修复 bug。
脚本语言的书写格式(基本语法)
https://github.com/bang590/JSPatch/wiki
JSPatch的使用技巧:
http://www.cnblogs.com/dsxniubility/p/5080875.html
什么是 JSPatch 平台?
需要使用者有一个后台可以下发和管理脚本,并且需要处理传输安全等部署工作,JSPatch 平台帮你做了这些事,提供了脚本后台托管,版本管理,保证传输安全等功能,让你无需搭建一个后台,无需关心部署操作,只需引入一个 SDK 即可立即使用 JSPatch。
JSPatch github开放的源代码和JSPatch 平台 的JSPatch SDK的关系
Github 开源的是 JSPatch 核心代码,使用完全免费自由,若打算自己搭建后台下发 JSPatch 脚本,可以直接使用 github 上的核心代码,与 JSPatch 平台上的 SDK 无关。JSPatch 平台的 SDK 在核心代码的基础上增加了向平台请求脚本/传输解密/版本管理等功能,只用于这个平台。
JSPatch 平台速度和稳定性如何?
通过 JSPatch 平台上传的脚本文件都会保存在七牛云存储上,客户端 APP 只跟七牛服务器通讯,支持高并发,CDN分布全国,速度和稳定性有保证。
js的下载和应用:
下载的那一段代码就是一个下载和鉴权管理器,应用的那一段代码是对官方文档里启用功能那一段代码的封装和容错
JS脚本的更新频率:
我之前看到很多人把使用和下载的代码都放在了didFinishLaunchingWithOptions这个方法。我觉得有所不妥,因为如果这个用户一直放在手机的后台(比如微信),并且也没出现内存警告的话,这个方法应该一直不会调用。我建议的是:使用文件的代码放在didFinishLaunchingWithOptions而下载文件的代码放在applicationDidBecomeActive因为这个方法在程序启动和后台回到前台时都会调用。并且我建议设置一个间隔时间,根据一些数据和权衡之后我们采用的是间隔时间设为1小时。也就是说每次来到这个方法时,先要检测是距离上次发请求的时间间隔是否超过1小时,超过则发请求,否则跳过。
接入的方式很简单,作者也提供了Demo程序,大致就分为几步:
①在General 的 LinkFrameworks and Libraries里面 添加javascriptcore.framework
这个库里主要用于js与oc语言的桥接,比如一些数据类型间的相互转化。
②podfile添加 pod 'JSPatch' 并pod install
③在代码中添加使用js和下载js的代码
这里作者也给出了示例,使用和下载
使用:
[JPEngine startEngine];
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];
NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];
[JPEngine evaluateScript:script];
下载:
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://cnbang.net/test.js"]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[JPEngine evaluateScript:script];
}];
具体在工作中使用JSPatch的图解如下:
JS下载后保存到本地的目录:
NSString *libraryDirectory = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
return [libraryDirectory stringByAppendingPathComponent:@"XXX"];