OCEval - Objective-C 解释器


未知
跨平台
C/C++

软件简介

目前流行的 JSPatch/RN
基于JavaScriptCore提供了iOS的热修复和动态化方案。但是都必须通过下发Javascript脚本来调用Objective-C。
尤其是JSPatch,编写大量的JS代码来调用OC的方法,开发效率较低(目前可以借助语法转换器),运行效率也会打折扣。
更好的方案是直接编写Objective-C代码,来实现热修复或者动态化方案。开发效率更高,代码的执行效率也更高。

在python和javascript等脚本语言里,有类似eval()函数来直接动态执行代码。所以我实现了OCEval
这个库,让我们能直接动态执行Objective-C代码。例子如下:

NSString *inputStr = @"return 1 + 3 <= 4 && [NSString string] != nil;";
NSNumber *result = [OCEval eval:inputStr]; // result: @(YES)

为了实现跟JSPatch类似的热修复功能,增加了方法替换。我们就可以通过下发Objective-C代码进行现有App的方法替换,来进行热修复的功能。

//在新的imp里直接调用旧的方法实现
NSString *viewDidLoad2 = @"{\
[originalInvocation invoke];\
";

[OCEval hookClass:@"ViewController"
         selector:@"viewDidLoad"
         argNames:@[]
          isClass:NO
   implementation:viewDidLoad2];

OCEval甚至可以用来完整的编写一个页面或者App,并动态下发。我在iOS的Demo里实现了一个简单的页面,具体见源码。