使用 SDK

初始化

使用组件前,需要完成的基本初始化操作。

前置条件

若要通过组件初始化,必须先完成 SDK 集成,详情请参见 集成 SDK

引入头文件

#import "TMFChristManager.h"

初始化

+ (instancetype)sharedManager;

公钥配置

整个热修复过程中传递的补丁文件是通过加密的,因此即使被截获也不会有信息丢失的风险。在平台上上传符合补丁文件格式的 .zip 包,热修复平台就会自动完成加密流程,而客户端则需要配置公钥来用于完成解密工作:

@property (nonatomic, retain) NSData *publicKey;

密钥对生成

在补丁加密解密及验证过程中,涉及到一对 RSA 非对称密钥,接入应用需要使用自己的密钥,保证补丁下发的安全性。下面介绍 RSA 密钥对生成步骤,其中⽣成的公钥(DER)可⽤用于 iOS 的验签。

  1. RSA 私钥⽣生成(PEM)。

    openssl genrsa -out private_key.pem 1024
    
  2. RSA 证书签名请求⽣生成(CSR)

    openssl req -new -key private_key.pem -out certificate_signing_request.csr
    
  3. RSA 证书⽣生成(CRT)

    openssl x509 -req -days 3650 -in certificate_signing_request.csr -signkey private_key.pem -out certificate.crt
    
  4. RSA 私钥⽣生成(P12)

    openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in certificate.crt
    
  5. RSA 公钥⽣生成(DER)

    openssl x509 -outform der -in certificate.crt -out public_key.der
    
  6. 需要将 public_key.der 文件导入工程目录中并配置。

  7. 上述”密钥对“生成工作需要在 终端(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');
    }
}
Copyright © 2013-2023 Tencent Cloud. all right reserved,powered by GitbookUpdate Time 2023-08-31 14:46:07

results matching ""

    No results matching ""