在Swift4中使用JSPatch

2018-07-26  本文已影响138人  范范饭特稀

前言

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相关注意事项

  1. 在官网下载SDK引入后,要先在项目的桥接文件里添加#import <JSPatchPlatform/JSPatch.h>以引用JSPatch。
  2. 无法直接调用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);
        }
})

在下发补丁之前最好对脚本进行本地测试,看看运行是否正常。
本地测试分两个步骤:

  1. 把补丁 main.js 拖入项目。
  2. 注释掉所有 JSPatch 相关方法,调用 +testScriptInBundle 方法:
   // tests_sinbund是混淆后的testScriptInBundle
   Eb_tCode.tests_sinbund()
// Eb_tCode.stwa_43("app key")
// Eb_tCode.strs_3x("公钥")
// Eb_tCode.sync()

相关参考

JSPatch文档
JSPatch语法
JSPatch在Swift中的应用

上一篇下一篇

猜你喜欢

热点阅读