无法在 Launch 代理中连接到 XPCService
Posted
技术标签:
【中文标题】无法在 Launch 代理中连接到 XPCService【英文标题】:Not able to connect to XPCService in a Launch agent 【发布时间】:2020-07-14 12:48:41 【问题描述】:我已经创建了一个 XPC 服务。
服务器端代码简要是
NSXPCListener *listener = [[NSXPCListener alloc] initWithMachServiceName:@"test.xpcserver"];
listener.delegate = delegate;
[listener resume];
这是使用 info.plist 作为启动代理安装的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>TestServer</string>
<key>MachServices</key>
<dict>
<key>test.xpcserver</key>
<true/>
</dict>
<key>ProgramArguments</key>
<array>
<string>/Applications/test.app/Contents/XPCServices/xpcserver.xpc/Contents/MacOS/xpcserver</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
服务器运行良好,我可以看到它在运行 launchctl list
客户端代码在另一个应用程序中,连接代码是:
connection = [[NSXPCConnection alloc] initWithMachServiceName:@“test.xpcserver” options:0];
connection.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(xpcserverprotocol)];
[connection resume];
service = [connection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) ];
[service ServerFunc:@“howdy” withReply:^(NSString *result)
NSLog(@"%@",result);
];
但无法连接到服务器。 关于出了什么问题的任何指示?
【问题讨论】:
【参考方案1】:很难从您发布的内容中分辨出来。检查事项:
确保您的侦听器委托正在为shouldAcceptNewConnection()
实现正确的函数签名。如果不正确,您将不会收到任何错误。应该是
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)conn your code here
launch.sh
,它根据本地路径生成plist。该示例使用的是 C API,因此不完全符合您的要求。
在此处查看旧的 Objective-C hello.tar.gz 示例:afewguyscoding.com/2012/07/ipc-easy-introducing-xpc-nsxpcconnection/
【讨论】:
【参考方案2】:(为未来的读者发布这个,我想 OP 现在解决了他们的问题 :))
需要检查的其他事项:
确保您的启动代理/守护程序使用的是-[NSXPCListener initWithMachServiceName]
,而不是+[NSXPCListener serviceListener]
。
/Library/...
中。如果你把它弄混了,你会在 Console.app 中得到一个崩溃报告,它会说:
配置错误:无法从服务包中检索 XPCService 字典。
在您的代理/守护进程中,不要忘记在[listener resume];
之后使用[[NSRunLoop currentRunLoop] run];
启动主运行循环
在你的代理/守护进程中,确保有一个强引用来保持你的听众的delegate
活着。 -[NSXPCListener delegate]
属性声明为 weak
,因此您的侦听器可能会在您设置后立即解除分配。为了确定,我会在您的代表班级的deinit
中添加一个NSLog
声明。
【讨论】:
以上是关于无法在 Launch 代理中连接到 XPCService的主要内容,如果未能解决你的问题,请参考以下文章
无法在 SKStoreProductViewController 中连接到 iTunes Store