JavaScriptCore + Socket.IO

Kex*_*Kex 2 javascript objective-c socket.io javascriptcore ios7

我正在尝试使用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 = io.connect(socket_url);

socket.on('connect', function(){
      log("Connected!");
});

socket.on('device-change', iOSBlock(deviceState)); 
Run Code Online (Sandbox Code Playgroud)

Tay*_*enn 6

JavaScriptCore本身只实现ECMAScript规范.像XMLHTTPRequest,Web套接字,DOM等的东西来自WebKit.如果你绝对想要运行Socket.IO JavaScript客户端,你可以使用隐藏的UIWebView,虽然我建议使用Socket.IO-objc.

在一个不相关的注释中,您可以通过检查其异常属性或通过设置将错误打印到exceptionHandler属性的块来查看JSContext生成的错误:

context.exceptionHandler = ^(JSContext *context, JSValue *exception) {
    NSLog(@"[%@:%@:%@] %@\n%@", exception[@"sourceURL"], exception[@"line"], exception[@"column"], exception, [exception[@"stack"] toObject]);
};
Run Code Online (Sandbox Code Playgroud)