博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 利用JSPatch 添加热补丁功能
阅读量:5140 次
发布时间:2019-06-13

本文共 4026 字,大约阅读时间需要 13 分钟。

ios 由于苹果的审核政策,一旦上线后发现bug是件让人崩溃的事情

不过可以利用oc的runtime机制可以家用JSPatch动态的为工程打热补丁

下载地址:https://github.com/agelessman/JSPatch.git

如果不用cocoapods导入的话,不需要修改,如果拖到工程的,需要改头文件,

例如: #import “abc.h”

在appdelegate中添加类似下边的方法,写一个本地的属性记录补丁的版本号,如果文件存在,再调用

1 - (void)hotfix { 2      3     // 获得应用程序沙盒的Downloads文件夹路径 4      5     QKYGuideAccount *guideAccount = [QKYAccountTool guideAccount]; 6      7     NSArray *arrDownloadPaths =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); 8     NSString *loadPathsPath=[arrDownloadPaths objectAtIndex:0]; 9     NSString *patchPath = [loadPathsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"patch_%@.js",guideAccount.patchVersion.length ? guideAccount.patchVersion : @"0"]];10     NSFileManager *fileManager = [NSFileManager defaultManager];11     BOOL isdir = NO;12     if ([fileManager fileExistsAtPath:patchPath isDirectory:&isdir]) {13         [JPEngine startEngine];14         [JPEngine evaluateScript:[NSString stringWithContentsOfFile:patchPath encoding:NSUTF8StringEncoding error:nil]];15     };16     17     QKYLog(@"Downloads path: %@",patchPath);18 }

 

在控制器中添加下边的方法,目的就是发请求到服务器,获取是否更新,

1    //处理热修复 2     self.dataController = [[QKYListDataController alloc] init]; 3     [self.dataController getIsNeedHotfixResultWithSuccessBlock:^(QKYIsNeedHotfixResult *  _Nonnull success, BOOL last) { 4          5         if (success.code.integerValue == 1 && success.newpatch.integerValue == 1) {
// 现在补丁 6 [self.dataController downloadpatchWithUrl:success.patchurl]; 7 } 8 9 10 } errorMsgBlock:^(NSError * _Nullable error, id _Nullable msgBody) {11 12 }];13 14 NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];15 NSString *version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];16 NSMutableDictionary *dicM = [NSMutableDictionary dictionary];17 [dicM setValue:@"2" forKey:@"comefrom"];18 [dicM setValue:version forKey:@"patchappversion"];19 QKYGuideAccount *guide = [QKYAccountTool guideAccount];20 [dicM setValue:guide.patchVersion.length ? guide.patchVersion : @"0" forKey:@"patchversion"];

 

需要说明的是这里的dataController 是一个模型,下载补丁的方法封装到了这个模型中

在下载的条件成熟的情况下,下载附件

1 - (void)downloadpatchWithUrl:(NSString *)url { 2      3     if (!url) return; 4      5     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 6      7     AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 8      9     manager.responseSerializer = [AFHTTPResponseSerializer serializer];10     11     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];12     13     NSProgress *downloadProgress = nil;14     15     NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:&downloadProgress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {16         17         NSURL *downloadURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];18         return [downloadURL URLByAppendingPathComponent:[NSString stringWithFormat:@"patch_%@.js",self.result.patchversion]];19         20     } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {21         22  23         if (error) {24             return ;25         }26         QKYGuideAccount *account = [QKYAccountTool guideAccount];27         account.patchVersion = self.result.patchversion;28         [QKYAccountTool saveGuideAccount:account];29         30         [appDelegate hotfix];31         32         33     }];34 35     [downloadTask resume];36 }

下载成功后保存最新的补丁号到本地属性中,调用JSPatch,让刚下载的代码生效

需要特别说明的是,加载补丁文件,是有顺序的,例如0,1,2 而且补丁文件中使用的是js的代码,

能够帮助我的功能:

1 修复导致崩溃的错误

2 替换原来的方法

3.添加新的方法

4 替换原来的界面

等等,更多功能,有待研究

有问题可以写评论哦,

转载于:https://www.cnblogs.com/machao/p/5198555.html

你可能感兴趣的文章
第五次作业(最大公约数,最小公倍数)
查看>>
C++两水杯量出所需水量的小算法
查看>>
[面试真题] LeetCode:Same Tree
查看>>
iOS:quartz2D绘图
查看>>
测试步骤
查看>>
perl6 Socket
查看>>
APP 内发送邮件
查看>>
进度条
查看>>
使用命令修改ip地址
查看>>
mac平台安装类似yum的工具
查看>>
hdu3437 划分树 区间内小于第K大的值得和
查看>>
P1113 杂务
查看>>
20155320《网络对抗》MSF基础应用
查看>>
第七章 软件测试 课后习题
查看>>
一篇非常适合git入门的文章
查看>>
四级英语day10
查看>>
基于K-近邻分类算法的手写识别系统
查看>>
使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
查看>>
PC站跳转M站的方法
查看>>
wow 各职业体验(pvp)
查看>>