无法在 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

使用系统日志 (NSLog) 或为您的服务添加标准输出和标准错误日志。请参阅此hello_world_xpc example 中的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]

    后者仅对常规 XPC 服务有用(它会存储在 App 的包中,而不是在 /Library/... 中。如果你把它弄混了,你会在 Console.app 中得到一个崩溃报告,它会说:

    配置错误:无法从服务包中检索 XPCService 字典。

    在您的代理/守护进程中,不要忘记在[listener resume]; 之后使用[[NSRunLoop currentRunLoop] run]; 启动主运行循环

    在你的代理/守护进程中,确保有一个强引用来保持你的听众的delegate 活着。 -[NSXPCListener delegate] 属性声明为 weak,因此您的侦听器可能会在您设置后立即解除分配。为了确定,我会在您的代表班级的deinit 中添加一个NSLog 声明。

【讨论】:

以上是关于无法在 Launch 代理中连接到 XPCService的主要内容,如果未能解决你的问题,请参考以下文章

在 LSP 中连接到 socks5 代理

无法在 php 中连接到 mysql 8

无法在 SKStoreProductViewController 中连接到 iTunes Store

无法在 Xcode 中连接到本地服务器

Django 无法在 Docker 设置中连接到 Postgres

无法在 Python 程序中连接到 MySQL