Rollout
是国外开发者一个基于iOS运行时注入OC格式化的JS代码来修复/更新App的热修复工具,它有一套自己的JS命名空间及OC代码和JS代码转换的协议,而且它的功能强大且使用简单,文档详细且人性化。对版本兼容也做了可视化界面方便使用者操作,所以目前来说超过一定的月激活量后会收费,但是一切是值得的。
1、话不多说,直接贴上完整的OC和JS对照代码
OC代码:
NSData *jsonData = [TestModel getTestData];
NSString *string = @"http://10.0.5.70:9051/fa";
NSURL *url = [NSURL URLWithString:string];
NSMutableURLRequest *rq = [NSMutableURLRequest requestWithURL:url];
[rq setHTTPMethod:@"POST"];
[rq setHTTPBody:jsonData];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:rq
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);
NSLog(@"网络请求反馈成功");
}];
[sessionDataTask resume];
self.model.name = @"hello world";
memberVariable = @"成员变量修改值";
Rollout上对应的JS代码:
var jsonData = R.NSClassFromString("TestModel").call("getTestData");
var string = "http://10.0.5.70:9051/fa";
var url = R.NSClassFromString("NSURL").call("URLWithString:", string);
var rq = R.NSClassFromString("NSMutableURLRequest").call("requestWithURL", url);
rq.call("setHTTPMethod:", "POST");
rq.call("setHTTPBody:", jsonData);
var session = R.NSClassFromString("NSURLSession").call("sharedSession");
var sessionDataTask = session.call("dataTaskWithRequest: completionHandler:", rq, R.beta.createBlock("v@?@@@", function(data, response, error){
var string = R.NSClassFromString("NSString").call("alloc").call("initWithData: encoding:", data, 4);
R.printStringToConsole("网络请求反馈成功");
}));
sessionDataTask.call("resume");
var hello = "hello world";
self.call("model").call("setName:", hello);
self.call("setValue: forKey:", "成员变量修改值", "memberVariable")
2、代码细节说明:
Getting started with JavaScript
JavaScript Docs
Javascript Examples
Rollout
是通过编写的 JavaScript
代码来替换原生的代码来实现不更新(提交itunesconnect)App而达到更新App的工具。注意的是编写的JavaScript
是替换 原生代码并且保存同样的输入输出值类型。如果想保持原有代码,可以调用如下方法:
self.originalImplementation();
2.1 修改OC方法返回值:
@implementation StringUtils
+(NSString*) quote: (NSString*) s{
return [NSString stringWithFormat:@"quote %@", s];
}
@end
正常的使用结果:
NSString *quoteOnPanic = [StringUtils quote:@"harry”]; //quoteOnPanic: quote harry
但是如果需要返回是quote harry quote
, 那么就需要在Rollout
中对StringUtils
的+(NSString*) quote: (NSString*) s
进行 JavaScript
修改了:
StringUtils['+']['quote:'] = function (
s
) {
var returnValue;
var newJSS = s.jsString();
newJSS = newJSS + " quote";
var newOCS = R.createNSString(newJSS);
returnValue = self.originalImplementation(newOCS);
return returnValue;
};
使用结果:
NSString *quoteOnPanic = [StringUtils quote:@"harry”]; //quoteOnPanic: quote harry quote
2.2 对 ObjcBox
和 R
说明:
ObjcBox
是对OC NSObject *
实例化对象的封装,它能将OC对象转成JavaScriptValue
.R
:Rollout javascript namespace 是集成在Rollout SDK
中,且包含了一些方法(比如R.createNSString方法)和拥有项目运行时的Rollout 命名空间
对象。
R
的一些方法说明:
Function name | Description |
---|
R.NSClassFromString | 通过 JavaScript String 创建 OC类 |
R.createNSString | 通过 JavaScript Number 创建 ObjcBox<NSString*> |
R.createNSNumber | 通过 JavaScript Number 创建 ObjcBox< NSNumber*> |
R.createNil | 创建 OC 的 nil |
R.deviceProperties | Retrieve device properties, such as OS, locale, etc.检索设备的属性,例如OS,语言环境等等 |
R.showAlertView | 在界面展示 UIAlertView |
R.printStringToConsole | 打印日志 同OC的NSLog |
R.closeApplication | 关闭应用程序,同OC的exit(0) |
R.beta | Beta namespace |
2.3 对block的兼容
这个在官网说明是不支持的,Currently the callMethod function does not support passing structs, blocks, and pointers to id但是在和作者沟通后,已经支持beta版对block的支持,使用方式(R.beta.createBlock):
[session dataTaskWithRequest:rq
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
void (^ blockH)(NSString *result, BOOL success) = ^(NSString *result, BOOL success){
if (success) {
NSLog(@"success");
}
else {
NSLog(@"%@", result);
}
};
[self request:@"thanks rollout help me so much" compeltion:blockH];
session.call("dataTaskWithRequest:completionHandler:", rq, R.beta.createBlock('v@?@@@', function(data, response, error)
{
var string = R.NSClassFromString("NSString").call("alloc").call("initWithData:encoding:", data, 4);
R.printStringToConsole(string);
R.printStringToConsole("request success");
}));
var blockH = R.beta.createBlock("v@?@B", function(result, success){
if (success){
R.printStringToConsole("success");
}
else {
R.printStringToConsole(result.jsString());
}
});
self.call("request:compeltion:", R.createNSString("thanks rollout help me so much"), blockH);
你可能会对@@@ 和@B 感到疑惑,引用@Eyal的原话:
"
The encoding of the block is (returnEncoding)@?[argsEncodig…]
this is the encoding of the generate block @ is and id and B is BOOLYou can check this in by running @encode(<type>) in objc
"
3、注意事项:
多注意JS和OC代码类型的转换
测试代码下载