大概思路:后台开发一个相应的接口,在程序初始化的时候调用来获取是否要启用热更新功能和一个hotFix版本号,如果不起用热更功能直接return,反则用服务器的hotFix与本地的hotFix对比,如果服务器的hotfix高于本地的hotFix,下载服务器的热更资源。存在本地library下的caches文件夹中。
一个工程的热更新包括:1.代码的修改,用JSPatch。这个不多解释,在github上写的很清楚。
2.图片资源的更新。本地图片资源最大打到一个bundle中方便更新和修改(用文件夹也没什么关系),将需要热更的图片资源放到caches中。封装一个取图片的方法,先在caches中去判断此图片有没有,如果有用caches中的,如果没有用bundle中的。
+ (UIImage *)imageInBundleWithName:(NSString *)fileName {
//caches路径
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
//图片路径
NSString *strPath=[cachesPath stringByAppendingPathComponent:fileName];
NSLog(@"%@",strPath);
if ([[NSFileManager defaultManager] fileExistsAtPath:strPath]&&[IAParamManager shareInterface].isHotFix) {
return [UIImage imageWithContentsOfFile:strPath];
}
else{
//从bundle中取
NSArray *arr = [fileName componentsSeparatedByString:@"."];
NSString *name = nil;
NSString *type = nil;
if ([arr count] == 2) {
name = [arr objectAtIndex:0];
type = [arr objectAtIndex:1];
}
NSString *path = [[IAUtility frameworkBundle] pathForResource:name
ofType:type];
return [UIImage imageWithContentsOfFile:path];
}
}
3.如果做了国际化需要热更语言包。语言包的热更不能更语言里面的某个翻译,只能整个语言包的整体替换。也是封装一个语言翻译方法,在方法中判断
if ([[NSFileManager defaultManager] fileExistsAtPath:strPath]&&[IAParamManager shareInterface].isHotFix) {
NSBundle * languageBundle = [NSBundle bundleWithPath:strPath];
ss = [languageBundle localizedStringForKey:str value:@"" table:nil];
}
else{
NSString * path= [[self frameworkBundle] pathForResource:@“语言” ofType:@"lproj"];
NSBundle * languageBundle = [NSBundle bundleWithPath:path];
ss = [languageBundle localizedStringForKey:str value:@"" table:nil];
}
如果需要其他更新思路思路一样,先去caches中判断有误热更文件。
关于热更新的原理需要先理解runtime机制,推荐博客http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/