iOS中动态更新补丁策略JSPatch运用基础一

  • 时间:
  • 浏览:1

            }

    在进行Objective-C办法的调用时,分为这一生活,这一生活是调用类办法,这一生活是调用类的对象办法。

10

3

11

            }

                self.view().addSubview(view)

                    view.setBackgroundColor(UIColor.greenColor());

7

1

                viewDidLoad: function() {

7

defineClass("ViewController2: UIViewController <UIAlertViewDelegate>", {

4

20

        JSPatch是GitHub上有有一个 开源的框架,其不可以 通过Objective-C的run-time机制动态的使用JavaScript调用与替换项目中的Objective-C属性与办法。其框架小巧,代码简洁,有就让通过系统的JavaScriptCore框架与Objective-C进行交互,这使其在安全性和审核风险上都不 很强的优势。Git源码地址:https://github.com/bang590/JSPatch

12

同样也不可以 一次对多个Objective-C类进行引用:

                }

19

13

3

3

    [self performSelectorOnMainThread:@selector(creatView) withObject:nil waitUntilDone:nil];

13

6

8

13

    [super viewDidLoad];

4

15

            var alertView = require('UIAlertView')

14

                    view.setBackgroundColor(UIColor.greenColor())

11

11

6

12

defineClass(classDeclaration, instanceMethods, classMethods)

6

1

5

    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];

9

    defineClass('ViewController', {

在JavaScript中使用defineClass来定义和修改类中的办法,其编写格式如下所示:

    return YES;

defineClass('ViewController', {

            )

21

还这一生活生活更加简便的写法,直接在使用的就让对其进行引用:

将会在重写了类中的办法还会调用原办法,需用使用ORIG前缀,示之类下:

            alertView_clickedButtonAtIndex:function(alertView, buttonIndex) {

     alertView.addButtonWithTitle('OK');\

            })

7

7

11

14

2

5

7

8

1

对于Objective-C中super关键字调用的办法,在JavaScript中不可以 使用self.super()来调用,之类:

4

9

6

            }

对于Objective-C中的多参数办法,转化为JavaScript将参数分割的位置以_进行分割,参数完整篇 放到去 后面 的括号中,以逗号分割,示之类下:

    defineClass('AppDelegate', {

14

     "];

4

            )

3

8

                                                                                null

1

11

                newFunc: function() {

                genView: function() {

8

                    self.view().setBackgroundColor(UIColor.redColor())

                    label.setTextAlignment(1);

6

7

defineClass('ViewController', {

5

8

2

                    var label = UILabel.alloc().initWithFrame({x:0, y:0, width:3000, height:3000});

7

提示:将会原Objective-C的办法中将会包含了_符号,则在JavaScript中使用__代替。

     alertView.setTitle('Alert');\

4

                }

7

        通就让面 的示例,朋友发现使用JSPatch不可以 做这一 十分有趣的事。对于iOS应用来说,通过官方渠道AppStore进行程序池池的发布要通过人工审核,有时这一 审核周期会非常长,将会在开发者在编写代码时留下了这一 小漏洞,应用一旦上线,若要修改掉这一 bug就十分艰难了。有了JSPatch,朋友不可以 想象,将会不可以 定位到线上应用有问题图片的办法,使用JS文件来修改掉这一 办法,这将是多么cool的一件事,事实上,JSPatch的主要用途也是不可以 实现线上应用极小问题图片的hotfix。

    require('UIView, UIColor, UILabel')

13

6

    self.view.backgroundColor = [UIColor whiteColor];

1

                }

                    view.addSubview(label);

    [JPEngine startEngine];

4

8

3

除了后面 的代码,在ViewController.m文件中这麼 编写任何这一 的办法,运行工程,不可以 看一遍程序池池并这麼 崩溃,ViewController执行了creatView办法。

12

                    self.getProp("data")

            }

示之类下:

1

defineClass('ViewController', {

8

    [JPEngine evaluateScript:@"\

    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];

4

调用类办法:通过类名打点的办法来调用类办法,格式之类如下,括号内为参数传递:

        JSPatch引擎中支持3中办法进行JavaScript代码的调用,分别是使用JavaScript字符串进行代码运行,读取本地的JavaScript文件进行代码运行和获取网络的JavaScript文件进行代码运行。之类,将会让你通过JavaScript代码在项目中弹出有有一个 警告框,在Objective-C代码中插入如下代码:

8

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

                    self.setProp_forKey("JSPatch""data")

require('UIView').alloc().init()

9

3

2

}

8

                    label.setText("JSPatch");

    JSPatch的最大应用是在应用运行时动态的操作和修改类。

    view.backgroundColor = [UIColor redColor];

14

    [JPEngine evaluateScript:script];

JavaScript文件代码如下:

        通过cocoapods将JSPath集成进有有一个 Xcode工程中,在AppDelegate类的中编写如下代码:

                    return view;

2

4

        要使用JSPatch来进行Objective-C风格的办法编写,需用遵守这一 JavaScript与Objective-C交互的规则。

                    self.super().viewDidLoad()

view.setBackgroundColor(UIColor.colorWithRed_green_blue_alpha(0,0.5,0.5,1))

                creatView: function() {

                    self.super().viewDidLoad()

    [JPEngine startEngine];

10

            )

- (void)viewDidLoad {

    NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];

1

10

9

15

同样JSPatch也不可以 为类加带临时属性,用于在办法间参数传递,使用set_Prop_forKey()来加带属性,使用getProp()来获取属性,注意,JSPatch加带的属性不可以 使用Objective-C的setter与getter办法访问,如下:

                viewDidLoad: function() {

12

5

1

    });

6

1

2

9

9

12

1

                                                                                "OK",

defineClass('ViewController', {

在工程中加暗包含一个 js文件,编写如下:

            .initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles(

16

2

3

14

                viewDidLoad: function() {

     alertView.show(); \

    self.window.rootViewController = [[ViewController alloc]init];

     alertView.setMessage('AlertView from js'); \

                }

4

            viewDidAppear: function(animated) {

12

18

                                                                                "content",

                    self.view().setBackgroundColor(UIColor.redColor())

                    var label = UILabel.alloc().initWithFrame(view.frame());

运行工程,不可以 看一遍genView办法被替加带了js文件中的办法,原本红色的视图被修改成了绿色。

关于为类加带协议的遵守,和Objective-C中遵守协议的办法一致,如下:

1

                    var view = self.ORIGgenView();

9

                }

15

    NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];

4

5

   在编写JavaScript代码时将会需用用到Objective-C的类,需用先对这一 类进行require引用,之类,将会需用使用UIView这一 类,需用在使用前进行如下引用:

     var alertView = require('UIAlertView').alloc().init();\

- (void)viewDidLoad {

6

    UIView * view= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];

                                                                                "Alert",

    return view;

            console.log('clicked index ' + buttonIndex)

5

2

6

                                                                                )

10

        开发者也不可以 动态在Objective-C类文件中加带办法,之类在ViewController类中编写如下:

                    view.addSubview(label);

 require('UIView, UIColor, UILabel')

                touchesBegan_withEvent(id,touch){

5

7

            }

                myLoad:function(){

10

7

16

5

            .alloc()

                    label.setTextAlignment(1);

2

11

13

2

    [JPEngine evaluateScript:script];

9

3

}

            },

17

6

6

require('UIView, UIColor, UILabel')

    [super viewDidLoad];

- (UIView *)genView

2

                },

1

                    var view = UIView.alloc().initWithFrame({x:20, y:20, width:3000, height:3000});

                                                                                self,

3

10

9

5

    [self.window makeKeyAndVisible];

            }

                    self.ORIGviewDidLoad()

1

    });

}

15

调用实例办法:通过对象打点的办法调用类的实例办法,格式如下,括号内为参数传递:

            alertView.show()

9

对于Objective-C类的属性变量,在JavaScript中不可以 使用getter与setter办法来访问,示之类下:

2

重写将会加带类的办法:

3

11

            },{

3

1

            }

{

8

                    label.setText("JSPatch");

10

    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];

17

5

            )

13

4

}

    [self.window addSubview:[self genView]];

5