iOS - JSPatch具体使用
来源:互联网 发布:lol断开连接请检查网络 编辑:程序博客网 时间:2024/05/17 18:03
github download
1.一个管理JSPatch的的类JSPatchManager
2.在项目变为活跃状态时候检测是否需要热更新
[[JSPatchManager sharedPatchManager] checkJSPatch];
2.1 JSPatchManager的变量和方法
@property (nonatomic,copy) NSString *libraryPath;@property (nonatomic,copy) NSString *rootPath;/** 当前版本号*/@property (nonatomic,copy) NSString *currentVersion;/** jspatch地址*/@property (nonatomic,copy) NSString *jsPatchPath;/** js文件地址 jsPatchPath + currentVersion*/@property (nonatomic,copy) NSString *jsPath;+ (instancetype)sharedPatchManager;- (void)checkJSPatch;
2.2 初始化的时候取出一些地址相关数据
+ (instancetype )sharedPatchManager{ static JSPatchManager *pathManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ pathManager = [[JSPatchManager alloc] init]; // 初始化各种路径 pathManager.libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject]; pathManager.rootPath = [pathManager.libraryPath stringByAppendingPathComponent:@"circle"]; pathManager.currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; pathManager.jsPatchPath =[pathManager.rootPath stringByAppendingPathComponent:@"jsPatch"]; pathManager.jsPath = [pathManager.jsPatchPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.js",pathManager.currentVersion]]; }); return pathManager;}
2.3检查是否需要更新和更新
2.3.1 逻辑:
从服务器请求数据(参数告诉服务器当前app的版本号),返回的数据有need_upgrade告诉你是不是需要更新,如果需要更新在判断是不是要下载js文件,++不需要重新下载js文件的只有一种情况,js文件已经下载过,而且下载过的js文件md5和当前的最新的md5相同,其余情况都需要重新下载++,然后执行js文件
2.3.2 代码:
- (void)checkJSPatch{ [JPEngine startEngine]; // 如果后面的needupdate js MD5相同,就不需要执行 if ([[NSFileManager defaultManager] fileExistsAtPath:self.jsPath]) { NSData *data = [NSData dataWithContentsOfFile:self.jsPath]; NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if (script && ![script isEqualToString:@""]) { [JPEngine evaluateScript:script]; } } NSDictionary *requestData = @{@"version":self.currentVersion, @"update_type":@"jspatch" }; // 网络请求 // 如果有新的更新:js存在,且md5和最新的相同不需要下载,其他都需要下载 if (@"download data success with responseObject") { NSDictionary *dataDic = @{@"responseObject":@"responseObject"}; if ([dataDic[@"need_upgrade"] boolValue]) { // 有需要更新的jspatch,判断需不需要下载新的jspatch if([dataDic[@"jsPatch_version"] isEqualToString:self.currentVersion]){ // js版本号和当前版本号一致 BOOL isNeedDownJS = NO; if ([[NSUserDefaults standardUserDefaults] objectForKey:@"jspatch_md5"]) { // md5存在,不是第一次使用 if ( ![[[NSUserDefaults standardUserDefaults] objectForKey:@"jspatch_md5"] isEqualToString:dataDic[@"md5"]]) { // jspatch的md5和本地的不一致,说明jspatch版本一致,但是内容改变了,需要重新download isNeedDownJS = YES; } }else{ // md5不存在 isNeedDownJS = YES; } if (isNeedDownJS) { [[NSUserDefaults standardUserDefaults] setObject:dataDic[@"md5"] forKey:@"jspatch_md5"]; [[NSUserDefaults standardUserDefaults] synchronize]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:dataDic[@"complete_url"]]]; // download // 下载文件 到 指定路径// return self.jsPath; // 验证文件是否正确 error 删除文件 // 如果需要立即执行,重新取reason: md5不同重新写入覆盖文件 if ([[NSFileManager defaultManager] fileExistsAtPath:self.jsPath]){ NSData *data = [NSData dataWithContentsOfFile:self.jsPath]; NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; [JPEngine evaluateScript:script]; } } } } }}
0 0
- iOS - JSPatch具体使用
- iOS JSPatch
- 使用JSPatch实现iOS APP动态更新
- JSPatch使用
- JSPatch使用
- iOS 使用JSPatch实现APP线上修复的热更新
- iOS热修复JSPatch
- iOS - JSPatch技术文档
- iOS JSPatch打补丁包
- iOS热修复 JSPatch
- iOS-JSPatch写UITableView
- iOS热修复(JSPatch)
- iOS- JSPatch 热更新
- iOS解决方案JSPatch
- iOS之JSPatch
- iOS Block 的具体使用
- JSPatch Loader 使用文档
- JSPatch使用原理详解
- 苹果从17年元旦开始强制要求HTTPS?!官方表示你们误会了
- spring AOP
- windows下用cmd命令netstat查看系统端口使用情况
- 使用JaxWsDynamicClientFactory动态调用自己创建的WebService服务
- 给AppCompatActivity的标题栏上加上返回按钮
- iOS - JSPatch具体使用
- 第十一周项目1-验证二叉树算法(1)
- JMeter学习-工具简单介绍
- 多页和单页应用模式区别
- 第十五周项目一(4)快速排序
- 第16周项目1-验证算法(8)基数排序
- Android全屏显示时,状态栏显示在最顶层,不隐藏。
- 期末数据结构总结
- 深度学习之SPP