将套接字与 NSXPCConnection 一起使用
Posted
技术标签:
【中文标题】将套接字与 NSXPCConnection 一起使用【英文标题】:Using Sockets with NSXPCConnection 【发布时间】:2015-01-06 20:18:27 【问题描述】:在使用带有 NSXPCConnection 的套接字时遇到问题。
基本上,有一个主进程和一个辅助进程在运行,通过 NSXPCConnection 建立。该辅助进程需要充当服务器并侦听特定端口(例如 111),该端口接收外部连接。
助手进程使用 Apple 提供的 TCPServer
助手类(CFSocket
的包装器)打开一个监听套接字。代码在这里找到:
https://code.google.com/p/iphone-remotepad/source/browse/trunk/RemotePad/TCPServer.h?r=238
套接字在- (BOOL)start:(NSError **)error
中打开成功。
外部客户端可以通过 111 端口建立。 (通过telnet localhost 111
在终端中测试)。
但是,辅助进程永远不会收到 TCPServer 回调 TCPServerAcceptCallBack
。
帮助进程启用了com.apple.security.network.client
授权。
另外,当我在主应用程序而不是辅助进程中运行 TCPServer 时,在端口 111 上设置服务器,并尝试连接到端口 111,我确实收到了回调。
关于为什么辅助进程没有收到套接字回调的任何想法? XPC 相关问题?
【问题讨论】:
【参考方案1】:好的,问题解决了。
xpc 服务为您提供类型为 dispatch_main 的默认运行循环。
您想用 NSRunLoop 替换它 - 通过更改 xpc 服务信息 plist 来完成:
https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html
完成后,您想在 xpc 服务中手动创建一个运行循环,如下所示:
do
@autoreleasepool
[[NSRunLoop currentRunLoop]run];
while (YES);
设置完成后,TCPServer(需要一个活动的运行循环)将返回回调,您将能够获取传入的数据。
【讨论】:
以上是关于将套接字与 NSXPCConnection 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
通过 NSXPCConnection 传递 xpc_object_t