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
原创粉丝点击