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

翻译 2016年08月30日 18:17:45
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 App热修复的设计方案及简单实践

iOS App热修复的设计方案及简单实践 iOS应用审核时间之长,只叫人不堪忍受;但是更让人捶胸的是,App好不容易上线了,结果发现上线的APP有明显的bug。哎,真他*的cd。于是呼,想...

App 后台架构设计方案 设计思想与最佳实践

原文出处:http://blog.csdn.net/smartbetter/article/details/53933096 做App做的久了,就想研究一下与之相关的App后台,发现也是蛮有趣的...

App 后台架构设计方案 设计思想与最佳实践

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] 转载请注明出处:http://blog.csdn.net/smartbetter/art...
  • kdsde
  • kdsde
  • 2017年01月09日 10:57
  • 473

App 后台架构设计方案 设计思想与最佳实践

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/53933096做App做的久了,就想研究一下与之相关的App后台,发现也是蛮有趣的。...
  • xzyERIC
  • xzyERIC
  • 2017年03月16日 09:37
  • 1932

App 后台架构设计方案 设计思想与最佳实践

CSDN 2016博客之星评选结果公布      【系列直播】零基础学习微信小程序!        “我的2016”主题征文活动     博客的神秘功能 App 后台架构...

App 后台架构设计方案 设计思想与最佳实践

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[-] 敏捷开发模式选择合适的数据库产品和服务器系统 数据库产品服务器系统 选择合适的消息队列软件使用分布式服务实现业务的复...
  • K_Men
  • K_Men
  • 2017年03月28日 11:47
  • 516

IOS移动APP网络层设计方案

iOS应用架构谈 开篇  iOS应用架构谈 view层的组织和调用方案  iOS应用架构谈 网络层设计方案  iOS应用架构谈 本地持久化方案及动态部署  iOS应用架构谈 组件化...

映客直播iOS App 性能优化实践,刘

  • 2016年08月24日 23:12
  • 1.07MB
  • 下载

UI设计人员获取上线iOS App 图片

  • 2016年10月10日 10:18
  • 1.48MB
  • 下载

app混合设计方案

互联网现在已经发展到一个沸腾的阶段了,几乎所有的创业公司都会借助互联网的力量来发展,所以必然会产生各种互联网产品,比如移动app,似乎这已经成为了必然的结果,但是众所周知开发一款app必然要经过设计、...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS App热修复的设计方案及简单实践
举报原因:
原因补充:

(最多只允许输入30个字)