I am trying to send an anonymous XPC listener endpoint to my daemon from user context in order to be able to do some bidirectional XPC.
I was trying to use the new XPCListener and XPCSession objects and the easiest method I figured was using the Codable version of the send() methods, in which I wanted to send the XPCEndpoint object - alongside the name of the anonymous endpoint (because I want to have more XPCEndpoints sent over, so I want to be able to identify them.
However, trying to manually encode XPCEndpoint throws an exception:
ERROR: Missing CodingUserInfoKey CodingUserInfoKey(rawValue: "_XPCCodable")
Here is a simple command-line tool reproducing the issue:
import Foundation
import XPC
let listener = try XPCListener(service: "mach-service.xxx.yyy", incomingSessionHandler: {
$0.accept(incomingMessageHandler: { (msg: XPCReceivedMessage) in
return nil
})
})
var endpoint = listener.endpoint
do {
let endpointData = try JSONEncoder().encode(endpoint)
print("EndpointData object: \(endpointData.count) bytes")
} catch let error {
print("ERROR: \(error)")
}
Wrapping my object into an XPCDictionary, then adding multiple keys alongside an "endpoint" key with the XPCEndpoint as value works, but XPCDictionaries are less ideal - they don't even support vanilla Data objects, only ones converted to an xpc_object_t with xpc_data_* functions
Is this expected behavior? I shouldn't encode an XPCEndpoint myself? I am using the latest Xcode 26.0 beta, with deployment target of macOS 15.1, running on macOS 15.5.
(Btw it's also incorrect that this XPCEndpoint API is available from macOS 15.0 - it cannot be found in Xcode 15.4 under macOS 15.5. At the very best it's backDeployed but this isn't mentioned in its public declaration.)
4
0
321