美文网首页
在Swift4中使用JSPatch

在Swift4中使用JSPatch

作者: 范范饭特稀 | 来源:发表于2018-07-26 17:10 被阅读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中的应用

    相关文章

      网友评论

          本文标题:在Swift4中使用JSPatch

          本文链接:https://www.haomeiwen.com/subject/ucnbmftx.html