Rollout学习2 JS和OC代码对照篇

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 // ObjcBox<NSString *> 
  // self - ObjcBox<StringUtils *>
  // R    - Rollout javascript namespace
) {
    var returnValue; 
    var newJSS = s.jsString();    //OC转JS(NSString)
    newJSS = newJSS + " quote";   //JS对newJSS处理
    var newOCS = R.createNSString(newJSS); //JS转OC(NSString)
    returnValue = self.originalImplementation(newOCS); //调用OC原生的方法
    return returnValue;
};

使用结果:

 
 
 
NSString *quoteOnPanic =  [StringUtils quote:@"harry”];  //quoteOnPanic: quote harry quote

2.2 对 ObjcBoxR 说明:

ObjcBox 是对OC NSObject * 实例化对象的封装,它能将OC对象转成JavaScriptValue.R:Rollout javascript namespace 是集成在Rollout SDK 中,且包含了一些方法(比如R.createNSString方法)和拥有项目运行时的Rollout 命名空间 对象。

R 的一些方法说明:

Function nameDescription
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) {
                                                       
}];
//使用 block 语句块
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");
}));
//JS对应的 block 语句块
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代码类型的转换

测试代码下载


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值