xietao3

探索之旅,学习之路

你好,我是谢涛!欢迎来到我的个人主页.
90后代码搬运工,目前就职于上海天天果园,任职iOS高级开发工程师。


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

结语

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

最近的文章

算法-冒泡排序

貌似是程序员基础,我一个高级开发竟然只会冒泡(羞耻ing…)前言之前买了剑指offer,一直搁那里没怎么看,现在挑灯夜读挤出点时间学习下,在这之前还是得先把基础给打牢,这里先介绍算法入门-冒泡排序。核心思想冒泡排序的核心思想就是通过与相邻元素的比较和交换,把小的数交换到最前面。因为这个过程类似于水泡向上升一样,因此被命名为冒泡排序。示例 第一轮过程: i=0~9;依次进行arr[i]与arr[i+1]对比;arr[i]小则不交换,arr[i+1]小则与arr[i]交换位置,由于100...…

继续阅读
更早的文章

Jekyll发布文章+评论模块

我想成为聪明的人,所以我在学习。前言在搭建好博客之后,又给自己增加的评论模块,还建了一个我自己比较喜欢关于页面,简单地介绍了下自己。参考Jekyll + Github Pages构建个人技术博客写作环境 使用Macbook,我一般是使用Mou写,实时预览功能很好用,Help -> Mou Help打开语法提示 在Windows下,我直接在简书上写,也有实时预览效果,而且会实时保存,需要联网Markdown Markdown上手还是很快的,使用简便,语法简单Markdown语...…

继续阅读