Michael

写写代码,说说人生

您好,我是Michael,欢迎来到我的个人家园。
代码搬运工,目前就职于XX证券,努力修行中。


H5 / Java / Objc / Swift / Vue / RN

JSPatch使用小记

如何与产品和谐相处

前言

由于苹果审核周期过长,导致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

结语

宝剑用好了是制胜利器,没用好的话…

最近的文章

TensorFlow 在 iOS 平台上的使用(一)

  距离上次使用 TensorFlow 在iOS平台上做的小 Demo,已经过了四个月了,今天忽然想再看看,发现 Demo 已经不见了,我只能从头在编一次,这次发现编译 iOS 库,简单多了。  tensorflow 下载地址,tensorflow 最近提交的时间:2016-11-03,commit:7b7c02de56e013482b5fe5ab05e576dc98fe5742 。  下载完成后打开文件,找到目录 tensorflow-master/tensorflow/contrib/...…

机器学习继续阅读
更早的文章

学习Markdown

这个世界太浮夸了,做技术的攀比也这么严重,还是要想想自己想要的是什么,再出发。前言 这个是本人练手用滴,勿喷。1、代码块NSSting *str = [[NSString alloc] init];str = @"123";NSLog(@"123"); Use the printf() function. There is a literal backtick (`) here. Please don’t use any <blink> tags. — is th...…

博客建设继续阅读