JSPatch 学习三 -- 热修复demo

学习那么多,最后的结果还是要用实战来检验。

1,首先导入JSPatch

很简单要不是手动导入http://jspatch.com/Index/sdk再添加支持库

或者使用cocoapods  直接在podfile文件加入pod 'JSPatchPlatform' 然后pod install 就好了。

2,注册JSPatchPlatform账号

注册很简单,有一个邮箱就可以。成功之后添加自己的app项目,获取对应的appkey。添加一个版本,注意这个版本号要和你工程的版本号一致

3,工程中调用JSPatch方法

[JSPatch startWithAppKey:@"你的appkey"];

//调用你的appkey,会自动执行已下载到本地的 patch 脚本

//用来检测回调的状态,是更新或者是执行脚本之类的,相关信息,会打印在你的控制台

[JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) {

switch (type) {

case JPCallbackTypeRunScript:

NSLog(@"JPCallbackTypeRunScript--->执行脚本");

break;

case JPCallbackTypeUpdate:

NSLog(@"JPCallbackTypeUpdate--->脚本有更新");

break;

case JPCallbackTypeUpdateDone:

NSLog(@"JPCallbackTypeUpdateDone--->已拉取新脚本");

break;

case JPCallbackTypeUpdateFail:

NSLog(@"JPCallbackTypeUpdateFail--->脚本拉取错误");

break;

default:

break;

}

}];

JPCallbackType:

JPCallbackTypeUnknow        = 0,

JPCallbackTypeRunScript    = 1,    //执行脚本

JPCallbackTypeUpdate        = 2,    //脚本有更新

JPCallbackTypeUpdateDone    = 3,    //已拉取新脚本

JPCallbackTypeCondition    = 4,    //条件下发

JPCallbackTypeGray          = 5,    //灰度下发

JPCallbackTypeUpdateFail    = 6,    //脚本拉取错误

根据这个JPCallbackType,你能清楚地跟踪脚本拉取、执行等各种状态。

/*

进入开发模式

平台下发补丁时选择开发预览模式,会只对调用了这个方法的客户端生效。

在 `+sync:` 之前调用,建议在 #ifdef DEBUG 里调。

*/

+ (void)setupDevelopment;

/*

与 JSPatch 平台后台同步,发请求询问后台是否有 patch 更新,如果有更新会自动下载并执行

可调用多次(App启动时调用或App唤醒时调)

*/

+ (void)sync;

这样整合下来,在appdelegate中的didFinishLaunchingWithOptions方法中调用。

[JSPatch startWithAppKey:@"你的appkey"];

[JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) {

switch (type) {

case JPCallbackTypeRunScript:

NSLog(@"JPCallbackTypeRunScript--->执行脚本");

break;

case JPCallbackTypeUpdate:

NSLog(@"JPCallbackTypeUpdate--->脚本有更新");

break;

case JPCallbackTypeUpdateDone:

NSLog(@"JPCallbackTypeUpdateDone--->已拉取新脚本");

break;

case JPCallbackTypeUpdateFail:

NSLog(@"JPCallbackTypeUpdateFail--->脚本拉取错误");

break;

default:

break;

}

}];

#ifdef DEBUG

[JSPatch setupDevelopment];

#endif

[JSPatch sync];

4,在ViewController中测试

在ViewController添加一个uilabel,展示文字初始为“哈哈哈哈哈哈”


在js脚本中代码

defineClass('ViewController', {

jsPatchTest : function() {

self.label().setText("label的text被改掉了");

},

})

效果如图


同时给一个按钮添加点击事件

[btn addTarget:self action:@selector(testJSPatch) forControlEvents:UIControlEventTouchUpInside];

js中代码


可以看到效果是


之后跳转到下一页也没问题。

5,总结

1>,这个是联网的调用,本地的引入这个头文件#import<JSPatchPlatform/JPEngine.h>后调用JPEngine相应方法

比如你的本地脚本是main.js,那么代码就是

[JPEngine startEngine];

NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"main" ofType:@"js"];

NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];

[JPEngine evaluateScript:script];

他oc与js脚本中代码跟之前的一样。

这个本地js有一定的测试作用,比如你的联网的js拉取执行后,相应bug没有修复,或者方法没有执行,有可能是你的js脚本有问题。你可以在你的本地js测试方法和代码。


2>,xcode8.0 导入之后,要开启后台的capabilities -->keychain sharing,否则会在模拟器运行的时候报decompress error, md5 didn't match错误

3>,JSPatch想要漂亮的运用,oc或者swift代码转化成js脚本是关键之一。这里JSPatch大神bang590自己写的转换工具JSPatchConvertor很好用,但是也建议用这个JSPatchConvertor转换完成再去测试运行几次,确保js执行没问题。

4>,关于js脚本安全问题,网络上有好多,总结下来就一个方法那就是加密。比较推荐的一种的获取文件的MD5值比对+客户端与后台服务器一套公私密钥搭配起来更好。

其中获取文件MD5的方法如下

-(NSString *)Md5HashOfPath:(NSString *)path

{

NSFileManager *fileManager = [NSFileManager defaultManager];

// 文件是否存在.

if( [fileManager fileExistsAtPath:path isDirectory:nil] )

{

NSData *data = [NSData dataWithContentsOfFile:path];

unsigned char digest[CC_MD5_DIGEST_LENGTH];

CC_MD5( data.bytes, (CC_LONG)data.length, digest );

NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

      for( int i = 0; i < CC_MD5_DIGEST_LENGTH; i++ )

      {

          [output appendFormat:@"%02x", digest[i]];

       }

           return output;

          }else{

             return @"";

          }

}

5>,JSPatch补丁的管理,管理记录每个补丁的状态。建议如果是bug或者需要修正的东西太多,在js紧急处理完后,在原生app中及时修改上传审核。

个人整理,不喜勿喷,谢谢!!

学习资料

http://www.ithao123.cn/content-10690218.html

https://github.com/bang590/JSPatch

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容