You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift开发:如何跨机器向另一应用发送类的对象/实例?

MacOS Cocoa应用跨机器传输Swift类对象方案

要实现跨机器传输携带信息的类对象,核心步骤是对象序列化+网络传输+接收端解析,以下是具体实现方案:

1. 序列化类对象

Swift的Codable协议是实现对象与可传输格式(如JSON)互转的便捷方式,先让你的业务类遵循该协议:

import Foundation

// 定义携带信息的类,确保所有属性都支持Codable(基本类型、String、Date等默认支持)
class BusinessData: Codable {
    var identifier: Int
    var content: String
    var createTime: Date
    
    init(identifier: Int, content: String, createTime: Date) {
        self.identifier = identifier
        self.content = content
        self.createTime = createTime
    }
}

将类对象序列化为二进制数据(JSON格式):

// 创建示例对象
let dataToSend = BusinessData(identifier: 1001, content: "跨机器传输测试", createTime: Date())

do {
    // 序列化对象为JSON数据
    let jsonData = try JSONEncoder().encode(dataToSend)
    // 后续将jsonData通过网络发送
} catch {
    print("序列化失败:\(error.localizedDescription)")
}

2. 选择网络传输方式

根据你的需求,推荐两种常用的MacOS网络传输方案:

方案一:TCP直连(适合实时性要求高的场景)

使用Apple官方的Network框架实现TCP通信,发送端代码:

import Network

// 替换为目标机器的IP地址和自定义端口
let targetHost = NWEndpoint.Host("192.168.xxx.xxx")
let targetPort = NWEndpoint.Port(rawValue: 9000)!

let connection = NWConnection(host: targetHost, port: targetPort, using: .tcp)

connection.stateUpdateHandler = { state in
    switch state {
    case .ready:
        // 连接成功,发送序列化后的jsonData
        connection.send(content: jsonData, completion: .contentProcessed { error in
            if let error = error {
                print("数据发送失败:\(error.localizedDescription)")
            } else {
                print("数据发送完成")
            }
        })
    case .failed(let error):
        print("连接失败:\(error.localizedDescription)")
    default:
        break
    }
}

// 启动连接
connection.start(queue: DispatchQueue.global())

接收端监听端口并解析数据:

import Network

// 监听与发送端一致的端口
let listener = try! NWListener(using: .tcp, on: NWEndpoint.Port(rawValue: 9000)!)

listener.newConnectionHandler = { connection in
    print("收到新连接")
    connection.stateUpdateHandler = { state in
        if state == .ready {
            // 接收数据
            connection.receive(minimumIncompleteLength: 1, maximumLength: 1024 * 1024) { data, _, isComplete, error in
                guard let receivedData = data, isComplete, error == nil else {
                    print("接收数据异常:\(error?.localizedDescription ?? "未知错误")")
                    return
                }
                
                // 反序列化数据为类对象
                do {
                    let receivedObject = try JSONDecoder().decode(BusinessData.self, from: receivedData)
                    print("收到对象:id=\(receivedObject.identifier), 内容=\(receivedObject.content)")
                    // 这里调用你的业务代码处理该对象
                } catch {
                    print("反序列化失败:\(error.localizedDescription)")
                }
            }
        }
        connection.start(queue: DispatchQueue.global())
    }
}

// 启动监听
listener.start(queue: DispatchQueue.global())

方案二:HTTP POST请求(适合简单的请求响应场景)

发送端通过URLSession发送POST请求:

import Foundation

// 替换为目标机器的HTTP接口地址
guard let targetURL = URL(string: "http://192.168.xxx.xxx:8080/receive-data") else {
    print("无效的目标地址")
    return
}

var request = URLRequest(url: targetURL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = jsonData

let task = URLSession.shared.dataTask(with: request) { _, response, error in
    if let error = error {
        print("请求失败:\(error.localizedDescription)")
        return
    }
    if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
        print("数据发送成功")
    }
}
task.resume()

接收端可以用轻量HTTP框架(如Vapor)搭建服务,或原生实现简单HTTP服务器,解析请求体中的JSON数据并转成类对象。

注意事项

  • 确保目标机器的防火墙允许指定端口的通信
  • 如果类中包含自定义子类型,需让子类型也遵循Codable协议
  • 传输大对象时,可考虑分块传输或使用更高效的序列化方案(如Protobuf)

内容的提问来源于stack exchange,提问作者yash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:50:48