前言
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。例如:
1 | // 混淆代码 |
1 | // 例如:Eb_tCode即JSPatch,stwa_43即startWithAppKey |
重点
集成JSPatch这些都很简单,最重要的是使用JSPatch语法写JS补丁。OC项目的话可以直接使用官方提供的代码转换器,Swift只能手敲啦。
defineClass中指定类名需要带上项目target的名字,重载自父类的方法不需要dynamic修饰符进行修饰,可以直接进行JSPatch动态替换。反之,必须加dynamic修饰符,这时候XCode会自动添加@objc修饰符。
例如:
1 | class ViewController: UIViewController { |
在下发补丁之前最好对脚本进行本地测试,看看运行是否正常。
本地测试分两个步骤:
- 把补丁 main.js 拖入项目。
- 注释掉所有 JSPatch 相关方法,调用 +testScriptInBundle 方法:
1 | // tests_sinbund是混淆后的testScriptInBundle |