XPC Client Calss
import Foundation
protocol XPCClientUtilDelegate {
func recvXPCDisconnectEvent()
}
class XPCClientUtil: NSObject {
var listener: NSXPCListener?
var connection: NSXPCConnection?
var clientReciver:XPCClientImpl = XPCClientImpl()
func start() {
NSLog("[XPCClientUtil] start.")
connection = NSXPCConnection(
machServiceName: "com.ponyo.macos.XPCServerWithSwift"
)
connection!.exportedInterface = NSXPCInterface(
with: XPCClientProtocol.self
)
connection!.exportedObject = clientReciver
connection!.remoteObjectInterface = NSXPCInterface(
with: XPCServerProtocol.self
)
connection!.invalidationHandler = connectionInvalidationHandler
connection!.interruptionHandler = connetionInterruptionHandler
NSLog("[XPCClientUtil] resume")
connection?.resume()
clientReciver.server = connection?.remoteObjectProxy as? XPCServerProtocol
clientReciver.server?.printHello()
}
func xpcDisconnect() {
}
private func connetionInterruptionHandler() {
NSLog("[XPCClientUtil] \(type(of: self)): connection has been interrupted.")
}
private func connectionInvalidationHandler() {
NSLog("[XPCClientUtil] \(type(of: self)): connection has been invalidated.")
}
func sendHello() {
clientReciver.server?.printHello()
}
}
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 user = try decoder.decode(User.self, from: jsonData)
print("Received User Object:")
print("ID: \(user.id), Name: \(user.name), Email: \(user.email)")
let responseUser = User(id: user.id + 1, name: "Reply to \(user.name)", email: user.email)
let encoder = JSONEncoder()
let responseData = try encoder.encode(responseUser)
reply(responseData)
} catch {
print("Failed to process JSON data:", 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 xpcClient:XPCClientUtil = XPCClientUtil()
xpcClient.start()
xpcClient.sendHello()