我相信这个问题的答案是“不”,但我将它发布给社区以防万一有人比我更成功。
我有一个特权帮助工具,客户端 Cocoa 应用程序与 NSXPCConnection 和 NSXPCInterface 一起使用。接口本身包括一个通过完成处理程序块提供返回码的方法。
在 Objective-C 中,客户端代码如下所示:
NSXPCConnection * xpcConn = [NSXPCConnection alloc]
initWithMachServiceName:kSvcName
options:NSXPCConnectionPrivileged];
// MyProtocol defines an instance method runCommand:(NSString*) withReply:^(int result)
NSXPCInterface * mySvcIF = [NSXPCInterface interfaceWithProtocol:@protocol(MyProtocol)];
xpcConn.remoteObjectInterface = mySvcIF;
[xpcConn resume];
if (nil == xpcConn.remoteObjectProxy) {
NSLog(@"ERROR - remote interface is nil, can't communicate with service");
}
[[xpcConn remoteObjectProxy] runCommand:nsstrCmd withReply:^(int result) {
NSLog(@"service result is: %d", result);
if (result != 0) {
self.svcResult = result;
self.svcCommandComplete = YES;
}
}];
我还有一个 pyobjc / py2app Mac 应用程序需要使用这个帮助工具的功能。我已经将该工具内置到 pyobjc 应用程序包中,通过 SMJobBless 进行签名和授权,但看起来有几个问题使实际使用此 API 不受支持:
1) 似乎不支持桥接 runCommand:withReply:^ 的调用 - 如果我理解正确,块仅支持 NS* 框架方法调用而不是“自定义”(即用户定义)方法?请注意,如果这是唯一的阻塞问题,我可以制作没有返回码的方法版本,但尝试并没有成功,因为......
2)为了以Objective-C的方式使用API,我需要创建一个@selector对runCommand的引用:它实际上没有任何python函数实现——它只需要一个定义签名的函数对象将由动态创建的 remoteProxy 提供的功能。我没有在 python 中定义 remoteProxy 实现。这似乎不受支持 - 如果没有 python 函数,我无法通过 objc.selector() 获得选择器声明。
3) 我不确定即使我可以让 2) 工作,正式协议的构造也会按照预期的方式工作,作为 interfaceWithProtocol: 的参数,来自 python - 它需要成为原生自定义 @protocol NSXPCInterface 可以在其工厂方法中使用来创建 remoteProxy。
感谢您提供任何提示,如果您已经知道如何在 pyobjc 中执行此操作,或者根据您对它的了解,任何明确的确认这些东西是不可能的。