iOS中nodejs-mobile与Objective C跨层消息传递方案问询
可行性与实现方案
完全可行,nodejs-mobile 原生支持 Node.js(WebSocket 客户端所在层)与 Objective-C 层的双向通信,下面提供两种常用实现方式:
方式一:通过消息通道(Channel)传递数据
这是 nodejs-mobile 官方推荐的通用通信方式,适配各类消息传递场景。
Node.js(JavaScript)侧代码
WebSocket 接收到消息后,通过通道将消息发送至 Objective-C 层:
const mobile = require('nodejs-mobile'); // WebSocket 客户端接收消息逻辑 webSocket.on('message', (textmessage) => { // 发送消息到 Objective-C 层,自定义消息标识用于区分业务类型 mobile.channel.send({ type: 'websocket_message', content: textmessage }); });
Objective-C 侧代码
监听通道消息,接收到后更新 UI(注意:UI 操作必须在主线程执行):
#import <NodeMobile/NodeMobile.h> // 初始化 nodejs-mobile 实例并设置消息监听 NodeMobile *nodeInstance = [[NodeMobile alloc] initWithScriptPath:@"你的JS脚本路径"]; [nodeInstance.channel setMessageHandler:^(id message) { if ([message isKindOfClass:[NSDictionary class]] && [[message objectForKey:@"type"] isEqualToString:@"websocket_message"]) { NSString *textmessage = [message objectForKey:@"content"]; // 切换到主线程更新 UI,避免线程异常 dispatch_async(dispatch_get_main_queue(), ^{ [textfield setStringValue:textmessage]; }); } }]; // 启动 Node.js 实例 [nodeInstance start];
方式二:注册原生导出方法供 JS 直接调用
该方式更贴近你给出的示例,让 JS 可以直接调用 Objective-C 中注册的方法。
Objective-C 侧代码
先注册要暴露给 JS 的方法:
#import <NodeMobile/NodeMobile.h> NodeMobile *nodeInstance = [[NodeMobile alloc] initWithScriptPath:@"你的JS脚本路径"]; // 注册导出方法,第一个参数为 JS 中调用的方法名,第二个为方法实现 [nodeInstance.exports registerExport:@"myObjCfunction" withBlock:^(NSArray *args) { if (args.count > 0) { NSString *textmessage = args[0]; // 主线程更新 UI dispatch_async(dispatch_get_main_queue(), ^{ [textfield setStringValue:textmessage]; }); } }]; [nodeInstance start];
Node.js(JavaScript)侧代码
WebSocket 接收消息后直接调用注册的 Objective-C 方法:
const mobile = require('nodejs-mobile'); webSocket.on('message', (textmessage) => { // 调用 Objective-C 中注册的 myObjCfunction 方法 mobile.exports.myObjCfunction(textmessage); });
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

