使用 SDK
初始化
使用组件前,需要完成的基本初始化操作。
前置条件
若要通过组件初始化,必须先完成 SDK 集成,详情请参见 集成 SDK 。
引入头文件
#import "TMFChristManager.h"
初始化
+ (instancetype)sharedManager;
公钥配置
整个热修复过程中传递的补丁文件是通过加密的,因此即使被截获也不会有信息丢失的风险。在平台上上传符合补丁文件格式的 .zip 包,热修复平台就会自动完成加密流程,而客户端则需要配置公钥来用于完成解密工作:
@property (nonatomic, retain) NSData *publicKey;
密钥对生成
在补丁加密解密及验证过程中,涉及到一对 RSA 非对称密钥,接入应用需要使用自己的密钥,保证补丁下发的安全性。下面介绍 RSA 密钥对生成步骤,其中⽣成的公钥(DER)可⽤用于 iOS 的验签。
RSA 私钥⽣生成(PEM)。
openssl genrsa -out private_key.pem 1024
RSA 证书签名请求⽣生成(CSR)
openssl req -new -key private_key.pem -out certificate_signing_request.csr
RSA 证书⽣生成(CRT)
openssl x509 -req -days 3650 -in certificate_signing_request.csr -signkey private_key.pem -out certificate.crt
RSA 私钥⽣生成(P12)
openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in certificate.crt
RSA 公钥⽣生成(DER)
openssl x509 -outform der -in certificate.crt -out public_key.der
需要将
public_key.der
文件导入工程目录中并配置。- 上述”密钥对“生成工作需要在 终端(Terminal)中完成。
检查更新
// 强制更新
- (void)checkForUpdates;
// 非强制更新
- (void)checkForUpdatesIfNeeded
初始化示例
// 初始化 TMFChristManager 实例
TMFChristManager *christManager = [TMFChristManager sharedManager];
// 将之前缓存的补丁执行注入
[christManager evaluateLocalChristians];
// 配置公钥 用于拉取到补丁后的解密工作
NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"der"];
christManager.publicKey = [NSData dataWithContentsOfFile:publicKeyPath];
// 使用 TMFChristManager 主动检查补丁更新
[christManager checkForUpdates];
初始化完成后,整个热修复工作就可以自行运行了,当有配置补丁文件时,就会自动加载并执行。
补丁执行
使用补丁执行接口,完成缓存中和拉取到的所有的补丁注入。
前置条件
若要执行补丁,必须先完成组件初始化,详情请参见 初始化。
补丁注入
可以通过接口,完成缓存中和拉取到的所有补丁注入:
- (void)evaluateLocalChristians;
资源目录
如果补丁不仅是简单的 JavaScript 文件,还包含了一些其他文件(例如:图片)的下发更新,补丁中就可以通过调用下面的接口来获取到资源:
-(NSString *)resourceDirectory;
补丁执行示例
下面是一个补丁执行的示例:
TMFChristManager *christManager = [TMFChristManager sharedManager]; // TMFChrist 组件
[christManager checkForUpdates]; // 检查更新同步
[christManager evaluateLocalChristians]; // 执行热修复
注意:热修复组件在初始化调用一次执行热修复之后,就无需再一次调用。若调用失败,内部在接收到新补丁下发后会自动执行注入修复操作。
热修复流程
热修复流程:补丁编写 > 补丁自测 > 平台发布 > 客户端组件执行热修复。
前置条件
补丁编写无前置条件。
补丁自测,必须先完成组件初始化,详情请参见 初始化。
补丁编写
热修复组件的补丁使用 onePatch
标准来编写,详见 onePatch 使用教程。
补丁自测
进行自测前,需要先将本地补丁文件导入到工程目录(例如:xxx.js),之后使用下面的方式配置加载:
// 借助 onePatch 进行本地自测
[[TMFChristManager sharedManager] evaluateChristiansWithScript:[[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"TMFChristTest.js" ofType:nil] encoding:NSUTF8StringEncoding error:nil]];
补丁打包
目前补丁平台接受的补丁文件格式为 .zip 的压缩包,压缩包内的文件目录格式如下:
根目录(补丁文件夹【补丁文件夹必须使用一级目录】)
|-- main.js
|-- uninstall.js
|-- 资源文件 (随补丁下发的资源文件 例如:图片)
|-- ...
文件 | 描述 | 必选 |
---|---|---|
main.js | 热修复补丁脚本,是通过本地自测后的脚本内容 | Y |
uninstall.js | 热修复补丁撤销脚本,用于实时回滚热修复补丁 | N (撤销补丁 Y) |
资源文件 | 随补丁下发的资源文件,可以在补丁文件中访问到当前资源 | N |
热修复示例
下面是一个热修复的示例:
例如线上有一段代码出现 bug 导致 crash:
@implementation TMFChristViewController
...
-(void)loadfixMethod1{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[nil] = @"";
}
...
@end
可以通过下发一段 JavaScript 补丁代码,覆盖原方法,修复此 bug:
class TMFChristViewController {
// loadfixMethod1
loadfixMethod1() {
log('TMFChristViewController_loadfixMethod_hook');
}
}