iOS App热修复的设计方案及简单实践
来源:互联网 发布:科幻小说 知乎 编辑:程序博客网 时间:2024/06/06 03:16
iOS App热修复的设计方案及简单实践
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.
0 0
- iOS App热修复的设计方案及简单实践
- iOS App热修复的设计方案及简单实践
- iOS 使用JSPatch实现APP线上修复的热更新
- 热修复Andfix原理及实践
- ios 热修复的方式
- Sophix热修复实践
- iOS开发 JSPatch实现热跟新及热修复
- 【iOS开发】APP增量更新和热修复
- 阿里HotFix热修复的简单使用
- iOS 热修复- JSPatch的(Hello World)
- iOS基于JSPatch的热修复
- Tinker实践:一步步带你集成Tinker,让你的APP也用上热修复,告别重复性更新
- iOS热修复JSPatch
- iOS热修复 JSPatch
- iOS HotFix热修复
- iOS热修复(JSPatch)
- ios学习--热修复jspatch的使用及使用注意问题
- android热修复实践-andfix
- 设计模式 - 结构型模式 - 组合模式
- 1082. Read Number in Chinese (25)
- 机器语言
- 项目管理和缺陷跟踪工具-Redmine安装部署(二)- redmine和svn结合
- 数据库查询记录中某些字段重复的方法
- iOS App热修复的设计方案及简单实践
- Oracle客户端登陆界面database扫描问题
- JAVA中int、String的类型转换
- Java 生成二维码
- WinSock网络通信
- Oracle UTL_RAW
- 内置晶体RTC的优势分析
- Spring MVC Controller配置方式
- 设计模式 - 结构型模式 - 装饰模式