前言
JSPatch平台SDK 1.7.5 以上版本可以通过苹果审核,我们这次尝试在Swift中使用JSPatch。JSPatch的动态更新是依赖于Objective-C的runtime,我们知道Swift是静态语言。Swift类成员可以使用Objective-C的运行时动态派发,这要求Swift类是继承自NSObject或者使用dynamic修饰的类的成员。
环境配置
SDK 1.7.5
Swift 4+, Xcode 9.4.1
SDK接入&调试
见官网JSPatch文档。
这里我们只讨论Swift相关应用。
Swift相关注意事项
- 在官网下载SDK引入后,要先在项目的桥接文件里添加
#import <JSPatchPlatform/JSPatch.h>
以引用JSPatch。 - 无法直接调用
JSPatch
中的方法,需要调用'JSPatch.h'
文件中混淆过后的代码调用JSPatch的相关API。例如:
// 混淆代码
#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
// 例如:Eb_tCode即JSPatch,stwa_43即startWithAppKey
Eb_tCode.stwa_43("app key")
Eb_tCode.strs_3x("公钥")
Eb_tCode.setupDevelopment()
重点
集成JSPatch这些都很简单,最重要的是使用JSPatch语法写JS补丁。OC项目的话可以直接使用官方提供的代码转换器,Swift只能手敲啦。
defineClass中指定类名需要带上项目target的名字,重载自父类的方法不需要dynamic修饰符进行修饰,可以直接进行JSPatch动态替换。反之,必须加dynamic修饰符,这时候XCode会自动添加@objc修饰符。
例如:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
test()
}
// 自定义的方法(属性)加dynamic修饰
@objc dynamic func test() {
// 此处view背景色为绿色
self.view.backgroundColor = .green
}
}
// main.js补丁
require('UIColor')
defineClass('项目名.ViewController', {
// 覆盖ViewController中的test方法,把view背景色改为红色
test: function() {
var redColor = UIColor.redColor();
self.view().setBackgroundColor(redColor);
}
})
在下发补丁之前最好对脚本进行本地测试,看看运行是否正常。
本地测试分两个步骤:
- 把补丁 main.js 拖入项目。
- 注释掉所有 JSPatch 相关方法,调用 +testScriptInBundle 方法:
// tests_sinbund是混淆后的testScriptInBundle
Eb_tCode.tests_sinbund()
// Eb_tCode.stwa_43("app key")
// Eb_tCode.strs_3x("公钥")
// Eb_tCode.sync()