使用JSPatch进行iOS(Swift)热修复操作步骤

2,081 阅读2分钟

使用JSPatch进行iOS(Swift)热修复操作步骤

1.集成SDK

1.1 在JSPatch官网将JSPatchPlatform.framework拖入项目,拖入项目中,勾选 "Copy items if needed",并确保 "Add to target" 勾选了相应的 target。

A622D3E2-4F0B-47E6-8638-C48BCD797A28.png

1.2 添加依赖框架:TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加 libz.tbdJavaScriptCore.framework

F0248B29-B725-4AFC-86AE-06AAE9FE8EB3.png

2 .配置RSA密钥

2.1 在 Mac 终端上执行 openssl,再执行以下三句命令,生成 PKCS8 格式的 RSA 公私钥,执行过程中提示输入密码,密码为空(直接回车)就行。

openssl >
genrsa -out rsa_private_key.pem 1024
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

2.2 生成配置代码并接入

接下来要生成公钥配置代码,接入 SDK 时使用。

可以通过 RSA配置自动生成 工具生成配置代码,打开 rsa_public_key.pem,复制内容到框里点击 生成配置代码 就可以了。也可以手动生成,把 rsa_public_key.pem 的内容换行手动改成 \n,并放入 [JSPatch setupRSAPublicKey:@""]

        [JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) {
//            NSLog(data,error); /// 1.7.5版本 bug  此方法打开后第一次加载补丁会崩溃
        }];
        [JSPatch startWithAppKey:kJSPatchKey];
        [JSPatch setupRSAPublicKey:kJSPatchPublicKey];

3.补丁发布与测试

3.1 配置App

在官网''我的App'新增App,填写App名称(随便写),会获取到一个appKey,该appKey就是在2.2代码中配置的常kJSPatchKey

新增App版本,App版本号一定要与工程的appVersion一致!

E00DEF59-6499-463E-A118-985DD20B4402.png

至此我们就可以进行补丁的下发。

4.补丁下发

4.1 补丁下发前的准备工作。

4.1.1 新建OC的配置文件,JSPatch对于swift语言的兼容性不是很好,需要通过引入OC文件配置appKey和publicKey等,也可以不用新建此文件通过混淆前的类进行配置。

#define JSPatch Eb_tCode
#define startWithAppKey stwa_43
#define setupRSAPublicKey strs_3x
#define setupTestScriptFileName sttsc_3
#define updateConfigWithAppKey udcak
#define testScriptInBundle tests_sinbund
#define JPCallbackType jtspc_b
#define JPErrorCode DRkcos
#define setupCallback sefjtpsytecal

4.2 原始swift需要添加的修饰词。想通过JSPatch进行热修复,类,属性等前必须添加 @objc dynamic 修饰。

import UIKit

class ViewController: UIViewController {

   @objc dynamic var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.label = UILabel(frame: CGRect.init(x: 100, y: 100, width: 100, height: 30))
        self.view.addSubview(label)
        
        self.test()
    }
    
   @objc dynamic func test() {
        self.label.text = "OOO"
    }

}

4.3 补丁下发。 针对4.2中label的热修复处理,我们需要通过js文件处理。

具体格式如下:

defineClass('JSPatchDemo.ViewController',{
	test :function() {
            self.ORIGviewDidLoad()
		self.label().setText("KKKKK");
        console.log('KKKKK')
	},
})

defineClass表示覆盖方法。JSPatchDemo表示工程名,ViewController表示类名。test :function()表示覆盖的方法名,在方法名前加 ORIG 即可调用未覆盖前的 OC 原方法。详细的使用语法:语法

下发补丁后的label的text变化为我们修改的值。

BC401A52-1846-41E7-A6B6-64209C91A7EA.png