2.1 HotFix简介

AliHotFix可以通过iOS中的javascriptcore.framewrok或者lua与C的交互能力,使得javascript代码以及lua代码能够通过调用Objective-C runtime接口实现动态植入新代码或者替换旧代码,以达到修复线上bug目的。

New:
1.目前AliHotFix支持以lua脚本或者js脚本两种方式编写patch进行热修复,lua脚本编写补丁支持多目录多文件;
2. js和lua脚本均使用本地签名证书打包加密后上传服务端,让用户上传patch补丁更加安全放心;

2.2 使用本地打包工具生成加密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)];

2.3 Patch制作和生成辅助工具

2.4 Patch上传注意事项

  • iOS Patch补丁包必须为使用本地打包工具加密打包的*.zip文件。为兼容之前版本SDK,目前百川平台仍支持直接上传main.js文件(备注:新版本AliHotFixSDK将不再解析执行直接上传main.js的补丁)
  • iOS Patch包使用本地打包工具自动加密打包生成,具体生成步骤以及patch包目录规范详见步骤2.2使用本地打包工具生成加密patch包
  • 每个下发的加密Patch包都是对应客户端相应的某个版本,同一个版本中的最新Patch包总是要包括该版本所有的bug修复,举个例子:
    • 新上线的版本1.0发现一个线上bug,标注为bug1;
    • 制作main.js(1),修复bug1或者patch.lua(1)文件修复bug1;
    • 之后该版本又发现一个bug,标注为bug2;
    • 制作main.js(2)或者patch.lua(2)文件修复bug1和bug2,使用main.js(2)替换 main.js(1)或patch.lua(2)替换patch.lua1,本地加密打包后上传百川hotfix平台。
  • lua文件断点调试 调试工具ZeroBrane Studio以及集成操作
  • js文件断点调试
    • iOS8下,支持使用Safari自带的调试工具对js脚本进行断点调试
      • 首先需要打开Safari 调试菜单:Safari -> 偏好设置 -> 高级 -> 勾选[在菜单栏中显示“开发”菜单];
      • 接着启动APP -> Safari -> 开发 -> 选择你的机器 -> JSContext 即可开始调试。
      • 连接真机调试时,需要打开真机的web检查器:设置 -> Safari -> 高级 -> Web检查器
  • Patch Convertor工具将OC代码自动转化成js或者lua代码过程中,以下几种OC/C的语法不支持情况需要手动转换:
    • 宏/枚举/常量
    • C函数调用
    • GCD函数
    • 指针/结构体
    • 私有变量的Getting/Setting

FAQ

关于此文档暂时还没有FAQ
返回
顶部