目前流行的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里实现了一个简单的页面,具体见源码。
评论