关于iOS App热修复的设计方案及简单实践

世界上最不能让程序员忍受的是:上线的App出现了bug,这个时候紧急修复尤为重要!

本来iOS应用审核时间之长,就已经叫人不堪忍受;但是更让人捶胸的是,App好不容易上线了,结果发现上线的APP有明显的bug。哎,真他*的cd。于是呼,想加入线上热修复的功能。

于是搜索了下网上的现成的设计方案。果然早已经有人想到并实现了,经过选择就用JSPatch了,果断下载并验证。经验证可以,所以热修复的核心问题就解决了。剩下的就是如何在工程中应用起来。初步设计,按照正常基本流程走。

首先,开发要提供热修复的脚本;这个对于本功能没有开发工作;

其次,要将脚本上传到后台;所以后台需要提供上传的操作页面;

然后,终端设备每次运行后,就去获取上传的脚本文件;

再然后,获取到脚本文件后,调用JSPatch引擎,执行脚本文件进行修复。

大体流程就是这样。剩下的就是完善上述流程的各个环节;

 

终端获取脚本文件是需要一个策略的,最简单的就是,终端根据版本号,获取与该版本号有关的脚本文件:

如:本次终端发布的版本是:1.0.3,那在上传脚本文件时,就可以将脚本文件的名称定义为:patch1_0_3.js

这样终端就可以根据版本号,动态组织脚本的下载地址,而且一个版本对应一个脚本文件,简单明了~~

 

为了安全,可以将脚本加密,终端收到加密的脚本的时候,再解密;

为了减少网络上文件传输大小,可以将js文件先zip压缩下,终端获取文件后,先解压在解密,最后执行脚本;

 

这样基本可以了额。上交互图:

另外附上加密解密的一种实现方式,来源于网络,奉献给网络,算法只是做了点修改,使其更通用:

 

/*字符串加密
 *参数
 *plainText : 加密明文
 *key        : 密钥 64位
 */
- (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key
{
    NSString *ciphertext = nil;
    const char *textBytes = [plainText UTF8String];
    NSUInteger dataLength = [plainText length];

    size_t bufferPtrSize = (dataLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
    unsigned char* buffer = (unsigned char *)malloc(bufferPtrSize);;
    memset(buffer, 0, bufferPtrSize);
    Byte iv[] = {1,2,3,4,5,6,7,8};
    size_t numBytesEncrypted = 0;
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding,
                                          [key UTF8String], kCCKeySizeDES,
                                          iv,
                                          textBytes, dataLength,
                                          buffer, bufferPtrSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
        
        ciphertext = [[NSString alloc] initWithData:[data base64EncodedDataWithOptions:0] encoding:NSUTF8StringEncoding];
    }
    free(buffer);
    return ciphertext;
}

//解密
- (NSString *) decryptUseDES:(NSString*)cipherText key:(NSString*)key
{
    NSData* cipherData = [[NSData alloc] initWithBase64EncodedString:cipherText options:0];
    
    NSUInteger dataLength = [cipherText length];
    size_t bufferPtrSize = (dataLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
    unsigned char* buffer = (unsigned char *)malloc(bufferPtrSize);;
    memset(buffer, 0, bufferPtrSize);
    
    size_t numBytesDecrypted = 0;
    Byte iv[] = {1,2,3,4,5,6,7,8};
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding,
                                          [key UTF8String],
                                          kCCKeySizeDES,
                                          iv,
                                          [cipherData bytes],
                                          [cipherData length],
                                          buffer,
                                          bufferPtrSize,
                                          &numBytesDecrypted);
    NSString* plainText = nil;
    if (cryptStatus == kCCSuccess) {
        NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
        plainText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    }
    
    free(buffer);
    return plainText;
}


文件解压缩就不上代码了~~

 

 

Done.

转载于:https://my.oschina.net/ttfGuestIOS/blog/682857

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值