Kiven's Program Space

一名程序员的自我修养

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

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

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

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

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

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

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

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

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


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

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

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


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

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


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


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

  1. /*字符串加密 
  2.  *参数 
  3.  *plainText : 加密明文 
  4.  *key        : 密钥 64位 
  5.  */  
  6. - (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key  
  7. {  
  8.     NSString *ciphertext = nil;  
  9.     const charchar *textBytes = [plainText UTF8String];  
  10.     NSUInteger dataLength = [plainText length];  
  11.   
  12.     size_t bufferPtrSize = (dataLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);  
  13.     unsigned char* buffer = (unsigned charchar *)malloc(bufferPtrSize);;  
  14.     memset(buffer, 0, bufferPtrSize);  
  15.     Byte iv[] = {1,2,3,4,5,6,7,8};  
  16.     size_t numBytesEncrypted = 0;  
  17.       
  18.     CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,  
  19.                                           kCCOptionPKCS7Padding,  
  20.                                           [key UTF8String], kCCKeySizeDES,  
  21.                                           iv,  
  22.                                           textBytes, dataLength,  
  23.                                           buffer, bufferPtrSize,  
  24.                                           &numBytesEncrypted);  
  25.     if (cryptStatus == kCCSuccess) {  
  26.         NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];  
  27.           
  28.         ciphertext = [[NSString alloc] initWithData:[data base64EncodedDataWithOptions:0] encoding:NSUTF8StringEncoding];  
  29.     }  
  30.     free(buffer);  
  31.     return ciphertext;  
  32. }  
  33.   
  34. //解密  
  35. - (NSString *) decryptUseDES:(NSString*)cipherText key:(NSString*)key  
  36. {  
  37.     NSData* cipherData = [[NSData alloc] initWithBase64EncodedString:cipherText options:0];  
  38.       
  39.     NSUInteger dataLength = [cipherText length];  
  40.     size_t bufferPtrSize = (dataLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);  
  41.     unsigned char* buffer = (unsigned charchar *)malloc(bufferPtrSize);;  
  42.     memset(buffer, 0, bufferPtrSize);  
  43.       
  44.     size_t numBytesDecrypted = 0;  
  45.     Byte iv[] = {1,2,3,4,5,6,7,8};  
  46.     CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,  
  47.                                           kCCAlgorithmDES,  
  48.                                           kCCOptionPKCS7Padding,  
  49.                                           [key UTF8String],  
  50.                                           kCCKeySizeDES,  
  51.                                           iv,  
  52.                                           [cipherData bytes],  
  53.                                           [cipherData length],  
  54.                                           buffer,  
  55.                                           bufferPtrSize,  
  56.                                           &numBytesDecrypted);  
  57.     NSString* plainText = nil;  
  58.     if (cryptStatus == kCCSuccess) {  
  59.         NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];  
  60.         plainText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  61.     }  
  62.       
  63.     free(buffer);  
  64.     return plainText;  
  65. }  

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


Done.
阅读更多
个人分类: iOS进阶
上一篇React Native通信机制详解
下一篇UITextField中secureTextEntry的潜在BUG
想对作者说点什么? 我来说一句

ios热修复demo

2018年05月21日 90KB 下载

APP视觉设计方案

2018年06月15日 1.76MB 下载

阿里热修复lib

2018年07月13日 627KB 下载

热修复源码

2017年05月18日 38.31MB 下载

ios 天气预报源代码

2015年05月19日 1.56MB 下载

简单iOS天气预报Demo

2013年04月14日 615KB 下载

android热修复

2018年03月20日 36.89MB 下载

IOS APP发布流程

2015年04月14日 1.73MB 下载

没有更多推荐了,返回首页

关闭
关闭