AliHotFix可以通过iOS中的javascriptcore.framewrok或者lua与C的交互能力,使得javascript代码以及lua代码能够通过调用Objective-C runtime接口实现动态植入新代码或者替换旧代码,以达到修复线上bug目的。
New:
1.目前AliHotFix支持以lua脚本或者js脚本两种方式编写patch进行热修复,lua脚本编写补丁支持多目录多文件;
2. js和lua脚本均使用本地签名证书打包加密后上传服务端,让用户上传patch补丁更加安全放心;
步骤一: 本地生成自签名证书
假设在.目录下执行命令
命令格式:COMMAND-PATH –generateRSAKey
例如:./tool/AliHotFixCommand –generateRSAKey
参数说明:
COMMAND-PATH: AliHotFixCommand所在路径(绝对和相对路径都可)
注意:执行该步骤的时候命令行会需要提示输入信息,此时一直按换行回撤键即可。在出现Enter Export Password:提示的时候需要输入p12文件的password,自己想一个或者随机生成一个复杂点的,请记住你输入的密码,不要泄露。这里对应PRIVATEP-12-FILE-PASSWORD后面打包patch要使用!
结果:将会在AliHotFixCommand所在目录生成
hotfix-rsa-private-key.p12(自签证书私钥)
hotfix-rsa-public-key.der(自签证书公钥)
步骤二: 按照以下规则建立Patch包目录结构,类似如下:
1.使用lua补丁的patch包结构:
其中patch/src 存放lua补丁代码,patch/lib 存放src目录下lua代码所需的公共类或工具类代码(非必须目录),tool目录存放打包需要的工具和密钥对.(备注:在src目录下的lua补丁文件支持多目录多文件)
2.使用js补丁的Patch包,目录结构如下(备注:js补丁文件放在patch/src目录下,只支持单个js补丁文件且文件必须命名为main.js)
步骤三: 对建立的Patch目录进行加密打包
假设在.目录执行命令:
命令格式:COMMAND-PATH –pack PATCH-DIRECTORY APP-VERSION ENCRYPT-KEY PRIVATE-P12-FILE-PASSWORD
例如: ./tool/AliHotFixCommand –pack ./patch 1.0.0 MSLJLL+==alsjflasjl+asl aqwert007
参数说明:
COMMAND-PATH: AliHotFixCommand所在路径
PATCH-DIRECTORY:patch包所在路径
APP-VERSION:patch绑定的app版本
ENCRYPT-KEY:加密patch文件的密钥(备注:长度不超过32位字符串)
PRIVATE-P12-FILE-PASSWORD:生成RSA密钥时输入的密码
结果: 命令执行完成之后会在patch同级目录下生成加密打包好的patch.zip包,将打包好的patch.zip补丁包上传百川后台。
步骤四:获取运行patch需要的密钥参数
假设在.目录执行命令:
命令格式: COMMAND-PATH –encryptKey ENCRYPT-KEY
例如:./tool/AliHotFixCommand –encryptKey 1234
参数说明:
COMMAND-PATH: AliHotFixCommand所在路径
ENCRYPT-KEY:加密文件密钥(备注:要与打包命令输入的相一致)
在终端中获得类似如下代码:
char aesEncryptKeyBytes[] = {xxxx}; //加密过后的aesKey二进制流格式 NSData *aesEncryptKeyData = [NSData dataWithBytes:aesEncryptKeyBytes length:sizeof(aesEncryptKeyBytes)]; char rsaPublicDerBytes[]={xxxx}; // 本地自签名公钥二进制流格式 NSData *rsaPublicDerData = [NSData dataWithBytes:rsaPublicDerBytes length:sizeof(rsaPublicDerBytes)];
AliHotFixSDK的patch补丁制作支持lua与js两种脚本语言编写。 SDK内部核心是嵌入的wax引擎与javascriptcore.framework.通过wax引擎使lua补丁脚本能与OC交互调用Runtime接口;通过iOS7+以后系统的javascriptcore.framework库使js补丁脚本能与OC交互调用Runtime接口,从而达到热修复的目的。
对于lua脚本编写补丁文件可以参考wax开源文档有详细的语法说明。