TL; DR: Как вы кодируете и декодируете MTLSharedTextureHandle
и MTLSharedEventHandler
так, чтобы его можно было транспортировать через соединение XPC внутри xpc_dictionary
?
Приложение macOS, над которым я работаю, широко использует службы XPC и было реализовано с использованием API на основе C.(т.е.: xpc_main, xpc_connection, xpc_dictionary...
) Это имело смысл в то время, потому что некоторые объекты, такие как IOSurfaces
, не поддерживали NSCoding/NSSecureCoding
и должны были быть переданы с использованием IOSurfaceCreateXPCObject
.
В macOS 10.14 Apple представила новые классы для совместного использования текстур и событий Metal между процессами: MTLSharedTextureHandle
и MTLSharedEventHandle
.Эти классы поддерживают NSSecureCoding
, но в интерфейсе C-XPC, похоже, нет аналога для их кодирования / декодирования.
Я думал, что мог бы использовать что-то вроде [NSKeyedArchiver archivedDataWithRootObject:requiringSecureCoding:error]
, чтобы просто преобразовать их в NSData
объекты, которые затем могут быть сохранены в xpc_dictionary
, но когда я пытаюсь это сделать, я получаю следующее исключение:
Caught exception during archival:
This object may only be encoded by an NSXPCCoder.
(NSXPCCoder - это закрытый класс.)
Это происходит как для MTLSharedTextureHandle
, так и MTLSharedEventHandle
.Я мог бы переключиться на использование нового NSXPCConnection
API, но у меня уже есть большой объем кода, построенного на C-интерфейсе, поэтому я бы предпочел не переключаться.
Есть ли способ архивировать любой из этих двух классов в полезную нагрузку, которую можно сохранить в xpc_dictionary
для передачи между службой и клиентом?