将套接字与 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 相关的问题?
出了问题。
xpc 服务为您提供 dispatch_main 类型的默认运行循环。
您希望将其替换为 NSRunLoop - 通过更改 xpc 服务信息列表来完成:
https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html
完成此操作后,您需要在 xpc 服务中手动创建一个运行循环,如下所示:
do {
@autoreleasepool {
[[NSRunLoop currentRunLoop]run];
}
} while (YES);
完成此操作后,TCPServer(需要活动的运行循环)将返回回调,您将能够获取传入的数据。