标签: javascriptcore

JavascriptCore:在JSExport中传递javascript函数作为参数

JavascriptCore是iOS7支持的新框架.我们可以使用JSExport协议将部分objc类暴露给JavaScript.

在javascript中,我试图将函数作为参数传递.像这样:

function getJsonCallback(json) {
        movie = JSON.parse(json)
        renderTemplate()
}
viewController.getJsonWithURLCallback("", getJsonCallback)
Run Code Online (Sandbox Code Playgroud)

在我的objc viewController中,我定义了我的协议:

@protocol FetchJsonForJS <JSExport>
 - (void)getJsonWithURL:(NSString *)URL
               callback:(void (^)(NSString *json))callback;
 - (void)getJsonWithURL:(NSString *)URL
         callbackScript:(NSString *)script;
@end
Run Code Online (Sandbox Code Playgroud)

在javascript中,viewController.getJsonWithURLCallbackScript可以工作,但是,viewController.getJsonWithURLCallback不起作用.

我在JSExport中使用了块有什么错误吗?谢谢.

javascript ios javascriptcore hybrid-mobile-app

4
推荐指数
1
解决办法
3628
查看次数

JavaScriptCore:尝试将JS函数作为块传递给Objective-C,获取'TypeError'异常

我一直在玩新的iOS 7/Mavericks JavascriptCore桥,尝试将Objective-C上的JS函数作为块.

JavascriptCore头文件声明只要支持每个参数,这是可能的,但尝试这样做:

JSContext *context = [[JSContext alloc] init];

context[@"Log"] = ^(NSString *message){NSLog(@"%@", message);};

context[@"BlockTest"] = ^(void (^blockTest)(NSString* blockString)){
    NSLog(@"Calling Block Test");
    blockTest(@"STRINGGGGG");
};

[context evaluateScript:@"BlockTest( function(dataString){Log('JS '+dataString);} )"];
Run Code Online (Sandbox Code Playgroud)

引发以下JS异常:

TypeError: '[object NSBlock]' is not a function (evaluating 'BlockTest( function(dataString){Log('JS '+dataString);} )')
Run Code Online (Sandbox Code Playgroud)

关于我的测试代码有什么问题的任何想法?

javascript webkit objective-c objective-c-blocks javascriptcore

3
推荐指数
1
解决办法
2067
查看次数

在JavascriptCore Framework for ObjectiveC中使用setInterval,setTimeout

我一直在尝试新的Objective C JavascriptCore框架.

这很疯狂,但它似乎没有setTimeoutsetInterval.哪个......我不明白.

  1. 我这是对的吗?
  2. 还有替代品吗?

我可以在Objective C中创建计时器,但我的大部分库都是用Javascript编写的,除此之外,看起来很奇怪没有setInterval或者setTimeout!!

我尝试了一些替代方法:

window.setInterval(function(){ /* dosomething */ }, 1000);
setInterval(function(){ /* dosomething */ }, 1000);

var interval;
interval = window.setInterval(function(){ /* dosomething */ }, 1000);
interval = setInterval(function(){ /* dosomething */ }, 1000);
Run Code Online (Sandbox Code Playgroud)

我无法监视JSVirtualMachine中甚至发生的事情.我所知道的是我的代码在setInterval被叫时停止工作.

任何帮助超级赞赏!

javascript objective-c javascriptcore ios7

3
推荐指数
2
解决办法
2536
查看次数

如何在JavaScriptCore中包含外部库?

我正在尝试通过JavaScriptCore加载外部库

具体来说,我想要最终的结果:

<script src="fancyLibrary.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

但是使用以下语法:

JSContext *context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]];
[context loadExternalJavascriptFileWithName:@"fancyLibrary.js"];

JSValue *fancyFunction = context[@"fancy"];
Run Code Online (Sandbox Code Playgroud)

这可能是在当前时间吗?我想我可以在应用程序包中包含外部库并从那里调用它.这是将库加载到上下文中的问题.

objective-c ios javascriptcore

3
推荐指数
1
解决办法
1689
查看次数

如何在 rollupjs 中禁用摇树

我正在尝试使用 RollUp.js 将几个 javascript 文件捆绑在一起,但是当我这样做时,未使用的类会被删除。这个过程称为摇树,我想禁用它。

我发现了这个,但它似乎没有任何影响。

// rollup.config.js

let configuration = {
  output: {
    format: 'es',
  },
  name: 'namename',
  input: './main.js',
  treeshake: false, // <-- disabling tree shaking?
};

export default configuration;
Run Code Online (Sandbox Code Playgroud)

我添加treeshake: false到配置中,但它似乎没有任何影响。这应该放在其他地方吗?

这是我正在尝试汇总的文件。

// Base.js
export default class Base {
  aMethod() {
    return "Hello";
  }
}

// main.js 
import Base from './Base.js';
Run Code Online (Sandbox Code Playgroud)

所以通过这个设置,我打电话rollup --config,它产生了一些空的东西。很明显,树抖动正在发生,即使我导入了它,它也会删除 Base 类。

到目前为止,我发现的唯一解决方法是实际创建类的实例,这是不可取的。

// main.js
import Base from './Base.js';

export default function () {
    {   
        new Base();
    } …
Run Code Online (Sandbox Code Playgroud)

javascript javascriptcore swift rollupjs

3
推荐指数
1
解决办法
1397
查看次数

iOS JavaScriptCore.framework验证

我有一个iOS应用程序,我正在尝试提交到App Store但它验证失败,因为我在我的项目中链接了JavaScriptCore.Framework库 - 因此无法将我的应用程序提交到App Store.这是验证我的应用时收到的错误消息:

The app links to non-public libraries in Payload/MyAppName.app/MyAppName: /System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore

是否有可能以任何方式链接此库而不会出现验证错误?

xcode ios javascriptcore

2
推荐指数
1
解决办法
563
查看次数

下载Javascript以便在UIWebView和JavascriptCore中执行

iOS许可条款规定:

3.3.2应用程序不得下载或安装可执行代码.如果所有脚本,代码和解释器都打包在应用程序中而未下载,则解释的代码只能在应用程序中使用.上述唯一的例外是由Apple的内置WebKit框架下载和运行的脚本和代码,前提是这些脚本和代码不会通过提供与预期和广告目的不一致的特性或功能来改变应用程序的主要目的.申请提交到App Store.

这是对这里讨论的术语的一个小改动: 除了在其框架内执行之外,iOS上的javascript是否必须通过*WebKit框架下载?

这可能意味着你可以下载并执行Javascript,如果它在UIWebView中执行,因为UIWebView是内置WebKit框架的一部分.

使用非UIWebView而不是JavaScriptCore下载和执行Javascript的情况如何.JavaScript核心是否被视为WebKit框架的一部分

app-store ios javascriptcore

2
推荐指数
2
解决办法
1866
查看次数

使用JavaScript核心框架从JavaScript调用本机目标方法

假设我有三个班级.

  1. 一个视图控制器,上面有一个按钮.
  2. JavaScript文件包含一些JavaScript方法.
  3. 模型目标类与一些调用Web服务的方法.

当我在视图控制器上按下按钮时,它会调用.js(JavaScript文件)并.js从模型类中调用文件调用方法.

我只是想知道是否可以在不使用Web视图的情况下使用JavaScript核心框架.

提前致谢.

javascript ios javascriptcore

2
推荐指数
1
解决办法
2833
查看次数

JavaScriptCore + Socket.IO

我正在尝试使用iOS应用程序连接到Node.JS服务器,但我没有使用第三方本机库,而是尝试将其与JavaScript Socket.IO客户端连接并传递我所拥有的数据收到我的原生代码.我正在将Socket.IO模块加载到JSContext中并加载得很好,我可以在io对象中看到所有可用的对象/函数.

但是当它到达连接到我的Node.JS服务器的行时,我的JavaScript代码的执行停止了,我找不到原因.

如果我暂停应用程序,我没有看到任何其他线程打开连接.JavaScriptCore是否可能不支持Web套接字?

我的Objective-C代码:

JSContext *context = [JSContext new];

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"socket.io" ofType:@"js"];
NSString *socketIO = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];;


filePath = [[NSBundle mainBundle] pathForResource:@"client" ofType:@"js"];
NSString *client = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
context[@"socket_url"] = @"http://192.168.1.128:8080";
context[@"log"] = ^(NSString *string){

    NSLog(@"JavaScript:\n\t%@", string);
};
context[@"iOSBlock"] = ^(id deviceState) {

    id JSON = [NSJSONSerialization JSONObjectWithData:deviceState options:NSJSONReadingMutableLeaves error:nil];
    // I'll do something here if I get reach this part :)
};

[context evaluateScript:socketIO];
[context evaluateScript:client];
Run Code Online (Sandbox Code Playgroud)

我的JavaScript代码:

var socket = …
Run Code Online (Sandbox Code Playgroud)

javascript objective-c socket.io javascriptcore ios7

2
推荐指数
1
解决办法
1102
查看次数

为什么console.log不能在JSC环境中工作,但它可以在Safari的调试控制台中运行

当我使用系统库中提供的JSC(JavaScriptCore)引擎时,它的行为与使用Safari的调试控制台时不同

$ /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc
>>> console.log("hello");
Exception: TypeError: undefined is not an object (evaluating 'console.log')
Run Code Online (Sandbox Code Playgroud)

console.log("hello");在Safari中工作完全正常.

javascript safari javascriptcore

2
推荐指数
1
解决办法
1447
查看次数

2
推荐指数
1
解决办法
2618
查看次数

如何翻译ObjC JS桥?

JavaScriptCore框架如何将JavaScript对象转换为Objective-C对象,反之亦然?桥接器是否使用相同的二进制协议来为两种目标语言进行通信?

javascriptcore

1
推荐指数
1
解决办法
911
查看次数

使用 JavascriptCore 和 JSContext 从 javascript 调用原生 Swift 代码

我正在尝试在 JSContext 中运行的 javacript 中使用本机 Swift 代码。

例如,我在 Swift 中实现了这个类:

class Greeter: NSObject {

   public func greet() -> String {
     return "Hello World!"
   }

   public func greetMe(_ name: String) -> String {
     return "Hello, " + name + "!"
   }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用 JSContext 来运行 javascript 代码:

let context =  JSContext()!
context.setObject(Greeter.self, forKeyedSubscript: "Greeter" as (NSCopying & NSObjectProtocol))

// Try my native functions:
let jsv1 = context.evaluateScript("Greeter.greet()")!
let jsv2 = context.evaluateScript("Greeter.greetMe(\"Jon Arbuckle\")")!

print("Greeter.greet() =  \(jsv1)") // prints Greeter.greet() = undefined
print("Greeter.greatMe(\"Jon …
Run Code Online (Sandbox Code Playgroud)

javascript javascriptcore swift

1
推荐指数
1
解决办法
2802
查看次数