0

我正在编写一个扩展程序,主应用程序在 PyObjc 中。我想设置主应用程序和扩展程序之间的通信。通过引用链接,我尝试编写协议。

SampleExtensionProtocol = objc.formal_protocol('SampleExtensionProtocol', (), [
    objc.selector(None, b"upperCaseString:withReply:", signature=b"v@:@@",isRequired=0),
    objc.selector(None, b"setEnableTemperProof:withReply:", signature=b"v@:@@",isRequired=0),
])

连接对象已创建。

connection = NSXPCConnection.alloc().initWithMachServiceName_options_("com.team.extension",NSXPCConnectionPrivileged)

注册元数据也是如此。

objc.registerMetaDataForSelector(b'NSObject', b'upperCaseString:withReply:', {
'arguments': {
    3: {
       'callable': {
          'retval': {'type': b'@'}, 
          'arguments': {
              0: {'type': b'^v'}, 
              1: {'type': b'i'}, 
          },
       },
    }
  }
})

objc.registerMetaDataForSelector(b'NSObject', b'setEnableTemperProof:withReply:', {
'arguments': {
    3: {
       'callable': {
          'retval': {'type': b'@'}, 
          'arguments': {
              0: {'type': b'^v'}, 
              1: {'type': b'i'}, 
          },
       },
    }
  }
})

但是在创建接口时出现错误。

mySvcIF = Foundation.NSXPCInterface.interfaceWithProtocol_(SampleExtensionProtocol)


ValueError: NSInvalidArgumentException - NSXPCInterface: Unable to get extended method signature from Protocol data (SampleExtensionProtocol / upperCaseString:withReply:). Use of clang is required for NSXPCInterface.
4

1 回答 1

1

无法在 Python 中定义可与 NSXPCInterface 一起使用的协议,因为该类需要“扩展方法签名”,无法使用公共 API 注册以在 Objective-C 运行时中以编程方式创建协议。

作为一种解决方法,您必须在定义协议的小型 C 扩展中定义协议。PyObjC 文档在https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html描述了一个小问题,包括如何避免这个问题。

于 2021-08-21T09:57:17.420 回答