用50行代码完成简单的iOS聊天应用

通过WebSocket在iOS、Android和Web上实现聊天功能

普里西拉·杜普雷兹( Priscilla Du Preez)在Unsplash上的照片

我用Node.js做过网络聊天应用程序,也做过简单版的安卓聊天应用。为了完整起见,我还创建了一个简单的iOS 网络聊天应用。

1_PRaW4YBGG-rSZCphOpQaKA

你可以在此处获取代码。

网络聊天在 iOS 中是如何实现的

1.创建一个 ObservableObject

首先,让我们创建一个ObservableObject 类型的类,因为我们想在消息更新时保留消息,这些消息将在SwiftUI中自动更新。

class WebSocketManager: ObservableObject {
    @Published var messages: [String] = []
    // other code
}

2. 创建 WebSocket

接下来,创建WebSocket对象。与Android不同,创建WebSocket不需要外部库。我们来看一下例子。

private let socket: URLSessionWebSocketTask =
    URLSession(configuration: .default).webSocketTask(
        with: URL(string: "ws://localhost:8082")!)

我们再次链接到按照本文设置的localhost :8082。

一旦设置完成,就可以使用resume() 连接到服务器

func setup() {
   socket.resume()
   self.receiveMessage()
}

至于receiveMessage ,我们将在下面解释。

3. 收听传入的消息

receivedMessage() 中,我们只需

  1. 调用socket.received() 函数。
  2. received 函数中,我们将检查.success.failure
  3. .success 时,我们只收集string ,尽管结果也可以是data
  4. 收到string 数据后,我们会将这些数据发送回主线程以相应地更新self.message
  5. 最后,由于已经成功处理了消息,我们需要再次调用receivedMessage() 来继续监听该消息。

代码如下。

func receiveMessage() {
    socket.receive { result in
        switch result {
        case .failure(let error):
            print("Error Detected: \(error)")
        case .success(let message):
            switch message {
            case .string(let text):
                DispatchQueue.main.async {
                    self.messages.append("\(text)")
                }
            default:
                print("Received data different format data")
            }
            self.receiveMessage()
        }
    }
}

4. 发送消息

除了接收消息,我们还设置了发送消息功能。发送消息时使用socket.send 函数,一旦消息发送的不成功,它能及时反馈。

func sendMessage(message: String) { 
    self .socket.send(.string("iOS: \(message)")) { (err) in 
        if err != nil { 
            print("发送时出错:\(err.debugDescription) )") 
        } 
    } 
    self .messages.append("iOS: \(message)") 
}

好了。只需要不到50行的代码就能完成简单的IOS应用啦(不包括SwiftUI界面方面的代码)。

原文作者:Elye
原文链接:https://medium.com/mobile-app-development-publication/simple-ios-chat-app-in-50-lines-of-code-66064ae50466