首页 > 代码库 > JSPatch学习记

JSPatch学习记

本文参考JSPatch wiki :https://github.com/bang590/JSPatch/wiki

1.概念

JSPatch是一个轻量的JS引擎,能够使用JavaScript语言来调用任何object-c接口,替换任何原生的方法。目前主要用于发步JS脚本替换原生Objective-C代码,实时修复线上bug

2.原理

利用OC语言的动态性,动态的修改类的方法和属性。在app启动的时候加载我们写好的JavaScript文件并通过JavaScriptCore来执行,用JS写好的类函数去篡改原有的OC函数。JSPatch只提供了篡改这个过程的代码,像部署线上Js代码、下载这些逻辑都得自己写。当然你可以用JSpatchSDK这个平台,这个平台帮我们部署JS代码、下载等一些逻辑。JSPatchSDK是收费的,也有免费版的。

3.部署

通过pod或者其他方式引入JSPatch,在didFinishLaunchingWithOptions函数加上如下代码:

[JPEngine startEngine]; 
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"js"];
NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];
[JPEngine evaluateScript:script];

部署完OC代码,我们就可以在index.js专心写JavaScript来修复线上的bug.

4.写JS代码

  • defineClass 用来定义(覆盖)一个类
  • defineClass(classDeclaration, [properties,] instanceMethods, classMethods)
    
    classDeclaration:字符串类型,代表类名字
    properties:一个字符串数组,代表要添加的属性列表
    instanceMethods:实例方法
    classMethods:累方法
  • 下面是一个例子:
  • defineClass(
        ‘MainViewController‘,
        {
            viewDidLoad:function(){
    
                self.super().viewDidLoad();
                self.view().setBackgroundColor(require(‘UIColor‘).redColor());
                self.navigationController().setNavigationBarHidden(true);
    
            }
        }
    )

     

 

<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px "Helvetica Neue"; color: #444444 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff } span.s1 { }</style>

JSPatch学习记