Swift中的WebSockets:一小时内创建实时应用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么WebSockets是Swift开发者的超能力?

\n\n

想象一下:你打开一个即时通讯应用,消息瞬间到达。没有无休止的页面刷新,没有“下拉刷新”。这就是实时的魔力,在Swift中通过WebSockets实现。如果你至今只使用HTTP请求,那你错过了一个充满可能性的世界:在线聊天、股票行情、实时通知、多人在线游戏。

\n\n

在本文中,我们将探讨如何将WebSockets添加到你的Swift应用中。没有废话——只有可以复制并运行的代码。到结束时,你将能够在不到一小时内编写出自己的第一个实时聊天应用。开始吧!

\n\n

什么是WebSockets,它们比REST API好在哪里?

\n\n

WebSockets是一种客户端与服务器之间的双向通信协议。与REST不同,在REST中客户端不断“轮询”服务器,WebSocket建立持久连接。服务器可以在数据可用时自行发送数据。这就像不断打电话问朋友“你到了吗?”与直接开门让他进来之间的区别。

\n\n

对于Swift开发者来说,主要优势是节省流量和资源。每分钟数十次HTTP请求——只需一次连接。非常适合交易应用、在线游戏、系统监控。

\n\n

什么时候应该在iOS中使用WebSockets?

\n
    \n
  • 在线聊天——消息必须即时送达。
  • \n
  • 股票行情——价格每秒都在变化。
  • \n
  • 多人在线游戏——同步玩家操作。
  • \n
  • 实时通知——新点赞、订单、消息。
  • \n
  • 物联网应用——传感器数据持续传入。
  • \n
\n\n

但不要到处使用WebSockets。如果你只需要加载商品列表——普通的HTTP GET就能更好地完成。当数据更新频率超过每10秒一次时,WebSocket才值得使用。

\n\n

在Swift中配置WebSocket:从零到第一次连接

\n\n

Swift内置了对WebSockets的支持——URLSessionWebSocketTask类。不需要任何第三方库。让我们编写一个简单的客户端。

\n\n

步骤1. 创建WebSocket连接

\n\n
import Foundation\n\nclass WebSocketManager: NSObject {\n    private var webSocketTask: URLSessionWebSocketTask?\n    private let session: URLSession\n    \n    override init() {\n        self.session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue())\n        super.init()\n    }\n    \n    func connect(to url: URL) {\n        webSocketTask = session.webSocketTask(with: url)\n        webSocketTask?.resume()\n        print("WebSocket连接已建立")\n        receiveMessage()\n    }\n    \n    func disconnect() {\n        webSocketTask?.cancel(with: .normalClosure, reason: nil)\n        print("连接已关闭")\n    }\n}\n
\n\n

这是一个基本封装。方法resume()启动连接——没有它什么都不会发生。请记住这个咒语:始终调用resume()。

\n\n

步骤2. 发送和接收消息

\n\n
extension WebSocketManager {\n    func sendMessage(_ text: String) {\n        let message = URLSessionWebSocketTask.Message.string(text)\n        webSocketTask?.send(message) { error in\n            if let error = error {\n                print("发送错误: \\(error.localizedDescription)")\n            }\n        }\n    }\n    \n    private func receiveMessage() {\n        webSocketTask?.receive { [weak self] result in\n            switch result {\n            case .success(let message):\n                switch message {\n                case .string(let text):\n                    print("收到消息: \\(text)")\n                

博客

书籍推荐