XPC Server Class
import Foundation
protocol XPCServerUtilDelegate {
func recvXPCDisconnectEvent()
}
class XPCServerUtil: NSObject, NSXPCListenerDelegate {
var listener: NSXPCListener?
var connection: NSXPCConnection?
var serverReciver:XPCServerImpl = XPCServerImpl()
internal func start() {
NSLog("[XPCServerUtil] start.")
listener = NSXPCListener(
machServiceName: "com.ponyo.macos.XPCServerWithSwift"
)
listener?.delegate = self
NSLog("[XPCServerUtil] resume")
listener?.resume()
}
private func connetionInterruptionHandler() {
NSLog("[XPCServerUtil] The session has interrupted.")
}
private func connectionInvalidationHandler() {
NSLog("[XPCServerUtil] The session has invalidated.")
}
func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool {
NSLog("[XPCServerUtil] listener.")
newConnection.exportedInterface = NSXPCInterface(
with: XPCServerProtocol.self
)
newConnection.exportedObject = serverReciver
newConnection.remoteObjectInterface = NSXPCInterface(
with: XPCClientProtocol.self
)
newConnection.interruptionHandler = connetionInterruptionHandler
newConnection.invalidationHandler = connectionInvalidationHandler
newConnection.resume()
serverReciver.client = newConnection.remoteObjectProxy as? XPCClientProtocol
self.connection = newConnection
return true
}
func sendHello() {
serverReciver.client?.printClientHello()
}
func sendJSON() {
do {
let user = User(id: 1, name: "John Doe", email: "john@example.com")
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let jsonData = try encoder.encode(user)
if let jsonString = String(data: jsonData, encoding: .utf8) {
print("JSON String:\n\(jsonString)")
}
serverReciver.client?.sendJSONData(jsonData) { responseData in
guard let responseData = responseData else {
print("No response from XPC")
return
}
do {
let decoder = JSONDecoder()
let responseUser = try decoder.decode(User.self, from: responseData)
print("Received User from XPC:")
print("ID: \(responseUser.id), Name: \(responseUser.name), Email: \(responseUser.email)")
} catch {
print("Failed to decode response:", error)
}
}
} catch {
print("Failed to encode user to JSON:", error)
}
}
}
XPC Protocol Class
import Foundation
@objc(XPCClientProtocol)
protocol XPCClientProtocol {
func printClientHello()
func sendJSONData(_ jsonData: Data, withReply reply: @escaping (Data?) -> Void)
}
class XPCClientImpl:NSObject, XPCClientProtocol {
var server:XPCServerProtocol? = nil
func printClientHello() {
print("Server Hello")
}
func sendJSONData(_ jsonData: Data, withReply reply: @escaping (Data?) -> Void) {
do {
let decoder = JSONDecoder()
let receivedObject = try decoder.decode([String: String].self, from: jsonData)
print("Received JSON:", receivedObject)
let responseObject = ["status": "success", "message": "Hello, \(receivedObject["name"] ?? "Guest")!"]
let encoder = JSONEncoder()
let responseData = try encoder.encode(responseObject)
reply(responseData)
} catch {
print("Error processing JSON:", error)
reply(nil)
}
}
}
@objc(XPCServerProtocol)
protocol XPCServerProtocol {
func printHello()
}
class XPCServerImpl:NSObject, XPCServerProtocol {
var client:XPCClientProtocol? = nil
func printHello() {
print("Client Hello")
}
}
Data Model Class
import Foundation
class User: Codable {
var id: Int
var name: String
var email: String
init(id: Int, name: String, email: String) {
self.id = id
self.name = name
self.email = email
}
}
Call Process
@main
let xpcServer:XPCServerUtil = XPCServerUtil()
xpcServer.start()
xpcServer.sendHello()