如何与产品和谐相处
前言
由于苹果审核周期过长,导致iOS App发包所需要的成本超出其他平台,在遇上一些严重Bug的时候,往往只能申请加急,审核加急又是有限制的。而JSPatch的闪亮登场,有效地解决了这一问题,关于基本使用的参考已经非常多了,本文着力讲优化相关。
参考
接入使用JSPatch
# Your Podfile
platform :ios, '6.0'
pod 'JSPatch'
检测更新
- 首先我们需要先判断是否需要更新,一般由一个单独接口返回,如果需要更新,再去获取最新的补丁,而我们本地要记录好补丁的版本号,下载修复包建议使用
JPLoader
,这个类几乎帮我们做好了所有事情。下载方法:
/**
* 更新到指定hotfix版本
*
* @param version 指定hotfix版本
* @param rootUrl 更新包所在服务器根地址
* @param publicKey 验签下载内容所需要的公钥
* @param callback 更新完成后的回调
*/
+ (void)updateToVersion:(NSInteger)version rootUrl:(NSString *)rootUrl publicKey:(NSString *)publicKey callback:(JPUpdateCallback)callback;
- 根据实际情况考虑是否要添加请求间隔,以避免接口请求过于频繁
/**
检测请求间隔(建议请求间隔为1小时)
@return 是否可以请求
*/
- (BOOL)checkRequestVersionInterval {
// 间隔检查
NSString *updateDateString = kUserDefaultsObjectForKey(kJSPatchUpdateDateKey);
NSDate *updateDate = [NSString dateFromString:updateDateString];
NSLog(@"old %@",updateDateString);
// 检查本地保存的时间是否合法
if (updateDate && [updateDate isKindOfClass:[NSDate class]]) {
NSDate *nowDate = [NSDate date];
NSLog(@"now %@",nowDate);
// 看是否到了需要更新的时候
if ([nowDate compare:updateDate] == NSOrderedAscending) {
return NO;
}
}
NSDate *newUpdateDate = [NSDate dateWithTimeIntervalSinceNow:3600];
NSString *newUpdateDateString = [NSString stringFromDate:newUpdateDate];
NSLog(@"new %@",newUpdateDateString);
[[NSUserDefaults standardUserDefaults] setObject:newUpdateDateString forKey:kJSPatchUpdateDateKey];
return YES;
}
加载修复代码
- 加载修复代码这里需要注意的是,万一补丁代码出错,造成的后果是不堪设想的,会导致App无法开启,连续闪退的情况,所以监控连续闪退的情况是十分有必要的。
- 这里的监测方法十分简单,延时器的简单用法
/**
检查Crash的情况(如果加载补丁后导致连续闪退 则不再加载)
@return bool
*/
- (BOOL)checkCrashEvent {
// 闪退次数延时清0
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:kJSPatchCrashCountKey];
});
NSString *crashCount = kUserDefaultsObjectForKey(kJSPatchCrashCountKey);
if (crashCount && [crashCount integerValue] > 0) {
NSInteger crashNum = [crashCount integerValue];
if (crashNum > 3) {
NSLog(@"连续闪退超过3次了");
return NO;
}
// 记录crash次数
crashNum++;
[[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%ld",crashNum] forKey:kJSPatchCrashCountKey];
}else{
[[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:kJSPatchCrashCountKey];
}
return YES;
}
- 用来实现闪退的相关代码,还有数组越界等方式
//crash code
{
NSArray *arr = [[NSArray alloc] init];
id fadeDict = arr;
NSDictionary *dict = fadeDict;
[dict getObjectForKey:@"key"];
}
- 在连续闪退的情况下不执行加载补丁方法
- 尽量避免正式环境和开发环境使用同一个RootUrl
结语
宝剑用好了是制胜利器,没用好的话…