如何使用 JavascriptCore 将 class 分配给变量

How to assign a class to a variable with JavascriptCore

我正在尝试为 iOS 使用 JavascriptCore 框架,但我遇到了问题。

我简单的javascript文字:

NSString * jsCode = @"var log = require('log'); log.test();";

我的 Obj-c 代码:

JSContext * context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]];

context[@"require"] = ^(NSString* sting) {
    NSLog(@"require ok");
    return [JsLogFacade class];
};

[context evaluateScript:jsCode];

我想做的就是将我的 JsLog class 分配给 javascript 中的 log 变量,这样我就可以在之后评估 log.test()

JsLogFacade.h

#import <Foundation/Foundation.h>
#import <JavaScriptCore/JSExport.h>

@protocol LogJsExports<JSExport>
+ (void) test;
@end

@interface JsLogFacade : NSObject <LogJsExports>
@end

JsLogFacade.m

#import "JsLogFacade.h"

@implementation JsLogFacade
+ (void) test {
    NSLog(@"It's working");
}
@end

我没有遇到任何错误,但我没有看到我的 NSLog。请注意,如果我删除块中的 return 语句,"require ok" 会起作用。

PS : 我不能只执行下面的代码,因为我不知道脚本最后的代码是什么

context[@"log"]=[JsLogFacade class];

你知道为什么我想做的事情是可能的吗?

您不应该将上下文条目分配为记录器的实例吗?如:

context[@"log"]=[[JsLogFacade alloc] init];

或在您的要求代码中返回实例而不是 class?

功能测试不应该是实例方法而不是 class 方法吗?

@implementation JsLogFacade
- (void) test 
{
    NSLog(@"It's working");
}
@end