【发布时间】:2018-09-11 20:56:09
【问题描述】:
我相信这个问题的答案是“不”,但我将其发布给社区,以防万一有人比我更成功。
我有一个特权帮助工具,客户端 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) 工作,正式协议的构造也会按照预期的方式工作@protocol NSXPCInterface 可以在其工厂方法中使用来创建 remoteProxy。
感谢您提供的任何提示,如果您已经知道如何在 pyobjc 中执行此操作,或者根据您的知识明确确认这些东西是不可能的。
【问题讨论】:
-
你搞定了吗。你能分享示例代码吗?
标签: macos cocoa pyobjc xpc nsxpcconnection