我试图用Node.JS应用程序连接到一个iOS服务器,但我没有使用第三方本地库,而是尝试将它连接到JavaScript Socket.IO客户机&将接收到的数据传递给我的本机代码。我正在将Socket.IO模块加载到JSContext中&它很好地加载,我可以看到io对象中所有可用的对象/函数。
但是,当它到达连接到我的Node.JS服务器的线路时,我的JavaScript代码就会停止执行&我无法找出原因。
如果我暂停应用程序,我没有看到任何额外的线程打开连接。难道JavaScriptCore不支持网络套接字吗?
我的目标-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];我的JavaScript代码:
var socket = io.connect(socket_url);
socket.on('connect', function(){
log("Connected!");
});
socket.on('device-change', iOSBlock(deviceState)); 发布于 2014-05-14 13:31:17
JavaScriptCore本身只实现ECMAScript规范。XMLHTTPRequest、web套接字、DOM等东西都来自WebKit。如果您绝对希望运行Socket.IO JavaScript客户机,那么您也许可以使用隐藏的UIWebView,尽管我建议使用Socket.IO-objc。
在一个无关的注意事项上,您可以通过检查JSContext的异常属性或设置一个将错误打印到exceptionHandler属性的块来查看exceptionHandler生成的错误:
context.exceptionHandler = ^(JSContext *context, JSValue *exception) {
NSLog(@"[%@:%@:%@] %@\n%@", exception[@"sourceURL"], exception[@"line"], exception[@"column"], exception, [exception[@"stack"] toObject]);
};https://stackoverflow.com/questions/23582514
复制相似问题