全部产品

使用 SDK

更新时间:2020-09-09 10:00:41

使用 SDK 步骤如下:

  1. 配置工程
  2. 管理加密信息
  3. 同步服务端脚本
  4. 热修复线上问题

配置工程

添加 SDK 之后,您需要按照以下描述配置工程:

  1. info.plist 中配置应用版本 Product Version。在发布平台中,需要根据这里配置的版本号进行发布。

    infoplist

  2. 发布平台支持白名单灰度发布。在这种情况下,客户端去拉取热修复脚本时,服务端会根据白名单判断是否下发热修复包给该用户。为此,客户端在 MPaaSInterfacecategory 中,需指定用户的 userID 信息:

    userid

旧版本升级注意事项

10.1.32 版本之后不再需要 info.plistProduct IDmPaaS 配置中间层会实现包装从 meta.config 中读取,旧版本中的 DynamicReleaseInterface 类的 Category 也不再需要,升级版本后请检查工程中是否存在旧版本配置,如果有请移除。

管理加密信息

Hotpatch 有自定义的验签流程,以此保证脚本来源的正确性。您需要使用 mPaaS Xcode Extension > 热修复生成资源包 对原始的 JS 脚本进行加密加签,再将其上传到发布平台,其流程如下:

  1. 读取脚本内容,对内容字符串做 MD5 加密。
  2. 以二进制格式读取脚本内容,对二进制内容做 AES128 加密。
  3. 创建 zip 文件,将上述两项内容添加到 zip 文件中。
  4. 以二进制格式读取上述 zip 文件,再进行一次 AES128 加密,加密后数据保存为 zip 文件。
  5. 以二进制格式读取上述 zip 文件,使用 SHA1 算法,做一次签名。
  6. 以二进制格式读取上述 zip 文件,加上数据分隔符,加上签名数据,组成脚本包。

客户端从发布平台获取到脚本包,也会使用相反的顺序解签,得到可以真正运行的脚本。

在 Hotpatch 脚本的验签和加解密这个过程中,涉及到一对 RSA 非对称密钥和一个 AES 对称加密密钥,每个接入应用需要使用自己的密钥,保证脚本下发的安全性。

管理 RSA 非对称加密

您需要按照以下描述管理 RSA 非对称加密:

  1. 执行以下命令生成公钥文件(public_key.pem)和私钥文件(private_key.pem):

    1. openssl genrsa -out private_key.pem 2048
    2. openssl rsa -in private_key.pem -pubout -out public_key.pem
  2. 将公钥文件添加到工程中:
    公钥

  3. main.m 中验证公钥自身的签名,以确保公钥文件未被替换。具体步骤如下:

    1. 执行以下命令生成公钥文件的签名二进制串:

      1. mpaas inst hotpatch sign -i /path/to/rsa_public_key.pem -p /path/to/rsa_private_key.pem -o /path/to/output.sig
      • -iopenssl 生成的公钥文件 public_key.pem
      • -popenssl 生成的私钥文件 private_key.pem
      • -o:签名二进制串输出文件。

      sign

    2. 将终端打印出来的签名数组拷贝到 main.m 方法中,对公钥自身进行签名。示例代码如下:

      1. #import <MPDynamicAdapter/MPDynamicInterface.h>
      2. static BOOL initDynamicSec()
      3. {
      4. char sig[] = {0xa,0xbb,0xe7,0x59,0x3a,0xf3,0x25,0x71,0x2d,0x24,0x35,0xac,0x69,0x5a,0x6b,0x4e,0x92,0x8f,0xf0,0x8c,0xcd,0xd,0x38,0x4,0xe2,0x97,0xb8,0x2a,0xe1,0xf7,0x6a,0x57,0xd9,0x9d,0x1b,0x6d,0x8b,0x3,0xc6,0x8d,0xc5,0xa,0x57,0x39,0x7b,0x98,0xe1,0xca,0x74,0x93,0xf8,0xf1,0x15,0xbd,0xfe,0x4,0x7,0x24,0xa5,0xda,0xe8,0x37,0x4e,0x8d,0x9b,0x56,0x86,0xe9,0xc2,0x2c,0x60,0x8f,0x9f,0x99,0x40,0xf1,0x97,0x97,0x15,0xd1,0x26,0x87,0x79,0x24,0x79,0x20,0xd6,0x96,0x62,0x70,0xbe,0x7c,0xda,0x1,0x63,0xe9,0x19,0xe1,0x1f,0x5a,0xc2,0x1b,0x97,0x1a,0xdb,0x11,0xbd,0xee,0xdc,0x40,0x99,0xc1,0x54,0x6e,0x9a,0x30,0xb2,0x44,0x45,0x64,0xa9,0xc,0xea,0x86,0x4c,0x7d,0x91,0x30,0xf5,0x41,0xe,0x30,0x8f,0x9c,0x85,0xdb,0xd,0xc1,0xc1,0xec,0x7d,0x31,0xb,0x77,0xce,0xf2,0xd5,0x5,0xd1,0xe9,0x32,0xf7,0x15,0xa5,0x53,0x79,0xee,0x55,0x86,0x2c,0x9a,0x30,0x2b,0xd,0xe9,0x36,0x9,0x31,0x26,0xa5,0x6d,0xaf,0xd,0xd5,0x72,0x16,0xd2,0xd7,0x2c,0x88,0x13,0x6a,0x87,0xf0,0x4c,0x7e,0xb0,0x34,0xc,0x2a,0x75,0xc3,0x71,0x18,0x6f,0xbc,0xc9,0x8a,0xb9,0x50,0xdd,0x7,0x19,0x76,0x7d,0x2d,0xcf,0x2d,0xc0,0xa6,0xe7,0x1d,0x48,0x26,0x6,0xee,0x2,0xb,0x5a,0x85,0x36,0x54,0x7e,0x9a,0x4d,0xf6,0x27,0x9c,0x30,0xc8,0x63,0x74,0x8b,0x82,0x9b,0x64,0x3b,0xd6,0x13,0x53,0xdc,0x36,0xb5,0xbc,0xb2,0x6a,0xd0,0x8f,0x18,0xbd,0x2a,0x5c,0x4b,0x4,0xc1,0x45};
      5. NSString *path;
      6. path = [[NSBundle mainBundle] pathForResource:@"public_key" ofType:@"pem"];
      7. return [MPDynamicInterface initDynamicSecWithPublicKey:path signature:sig sigLength:sizeof(sig)];
      8. }
      9. int main(int argc, char * argv[]) {
      10. @autoreleasepool {
      11. BOOL ret = initDynamicSec();
      12. if (NO == ret) {
      13. NSLog(@"The public key is modified.");
      14. }
      15. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
      16. }
      17. }
      说明:若 initDynamicSec() 返回 NO,则说明公私钥不匹配,需要修改,否则平台下发的包在客户端会校验不过,从而导致热修复失败。

管理 AES 对称加密

AES 对称加密的密钥保存在无线保镖图片 yw_1222.jpg 中。

  • 公有云:参照热修复 SDK 接入文档完成基础接入步骤后,工程中会自动生成无线保镖图片,您无需额外操作。
  • 专有云:请参考 mPaaS Xcode Extension > 无线保镖 生成专有云无线保镖图片。

同步服务端脚本

您需要确保客户端调用 SDK 提供的同步接口,以执行热修复逻辑,包括获取服务端下发的修复脚本、执行脚本、回滚等。

基于原生框架

在程序启动后(推荐在 didFinishLauncher 方法中)调用以下方法:

  1. [MPDynamicInterface initDynamicSyncLocalFile];

基于 mPaaS 框架

mPaaS 框架 DFClientDelegate 接管了应用生命周期,在程序启动时会自动调用热修复同步接口,您无需额外操作。

热修复线上问题

发现线上 Bug 后,可以使用 JSPatch 将线上的错误代码替换掉,然后通过发布平台推送给用户进行修复。步骤如下:

  1. 生成脚本
  2. 加密脚本
  3. 发布脚本

生成脚本

生成脚本的步骤如下:

  1. 定位问题原因,使用原生 Objective-C 代码进行本地修复验证。
  2. 验证通过后,用在线工具 JSPatchConvertorObjective-C 代码转为 JS 脚本,详细的转换规则请参考 JSPatchjspatch
  3. 为验证转化后 JS 脚本(假设为 Test.js)的正确性,可以将写好的 JS 文件拖入到工程中,并在程序启动时(推荐在 didFinishLaunchingWithOptions 中)手动调用 JS 脚本,验证问题是否被正确修复。示例代码如下:
    1. NSString *file = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"Test.js"]];
    2. [MPDynamicInterface runDynamicLocalFile:file];
  4. 测试通过后,将测试代码和 Test.js 脚本删除掉,以免影响原有代码逻辑。

加密脚本

为了安全,本地测试通过后的 JS 脚本文件,需要进行打包加密后才能提交到发布平台。

具体步骤如下:

  1. 使用 mPaaS Xcode Extension > 热修复生成资源包
    hotpatch
    图中各参数含义如下:
    • 脚本文件:本地测试验证通过后的 JS 脚本。
    • App Secret:即 mAppCenter 上的 appsecret。若 mPaaS Xcode Extension 未自动填入,请手动填入。
    • 私钥文件:与添加到工程中的公钥文件配对的私钥文件。详情请参考上文 管理加密信息 > 管理RSA 非对称加密
  2. Hotpatch 资源包默认保存在 JS 脚本同级目录下。包含如下文件:
    • Test.js:上传到发布平台的 JS 脚本文件。
    • Test.sig:加密后的签名文件。
    • Test.zip:加密后的脚本文件。通常在上传到发布平台之前,用来验证加密算法是否正确。
      资源包
  3. 为验证加密后的 js 脚本的正确性,可以将生成的 Test.zip 文件拖入到工程中,并在程序启动时(推荐在 didFinishLaunchingWithOptions 中)手动执行 Test.zip 脚本,验证问题是否被正确修复。
    1. NSString *file = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"Test.zip"]];
    2. [MPDynamicInterface runDynamicLocalSecFile:file];
  4. 测试通过后,将测试代码及 Test.zip 包删除掉,以免影响代码原有逻辑。
    说明:若此处测试通过,则说明对称加解密正确。此外,您还需要确保非对称加解密正确,详情请参考上文 管理加密信息 > 管理 RSA 非对称加密initDynamicSec() 方法。

发布脚本

上一步加密脚本验证通过后,将加密后的 Test.js 文件上传到发布平台进行线上修复验证,详细的热修复发布流程请参考文档 热修复管理