2022cm新地址 https://www.2022cma.com
这篇文章的内容其实很久之前就存在了,但是一直没发出来。有朋友了解这方面的使用,其实不难,或许复杂的是业务逻辑方面如何合理的处理。代码部分由 Swift 完成,建议大家可以多了解一下 Swift 强大的枚举,我个人感觉是 Swift 中最强大的技术特点之一了。
[objc] view plain copy
import SocketIO
// MARK: - SocketIO 连接处理部分
class SocketIOTool {
static let shared = SocketIOTool()
fileprivate var socketManager: SocketManager!
fileprivate let server = apiEnv.scheme + "://\(apiEnv.baseURL):8888"
/// 连接成功执行回调
typealias Completion = (() -> Void)
private init () {
}
/// 开始连接服务器
func startReceive(driverID: String, cookieKey: String, success: Completion?) {
// role - 1 乘客, 2 司机
let dict = ["user_id": driverID, "user_key": cookieKey, "platform": "ios", "role": "2"]
let manager = SocketManager(socketURL: URL(string: server)!, config: [.log(false), .compress])
let socket = manager.defaultSocket
socket.on(clientEvent: .connect) {data, ack in
Log(">>>>>>>>>>>> socket connected")
ack.with(["dachedriver-\(driverID)-received"]) // 应该是回应服务器握手
socket.emit("login", with: [dict]) // 向服务器发送事件
success?()
}
socket.on(clientEvent: .disconnect) { data, ack in
Log(">>>>>>>>>>>> socket disconnected")
}
// 监听所有事件
socket.onAny { event in
Log("收到服务器事件:", event.event, event.items)
if event.event == "error" {
//StatusMSG.show("Socket连接错误:\(event.items?.description ?? "")", duration: 3, type: .error)
Log("Socket连接错误:\(event.items?.description ?? "")")
return
}
// 取出事件内容json字符串,转换成字典
guard event.event == "new_msg", let jsonStr = event.items?.first as? String,
let data = jsonStr.data(using: .utf8),
let dict = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String: Any],
let code = dict["code"] as? Int else {
return
}
Log("事件code:", code)
Log("事件内容:", dict)
if let model = EventContent(code: code, dict: dict) {
// 发出通知给外界
NotificationCenter.default.post(name: DJNotification.socketEvent.name, object: model)
}
}
socket.connect()
self.socketManager = manager
}
/// 断开Socket服务器连接
func stopReceive() {
socketManager.disconnect()
}
/// 断开再重连
func reConnect() {
if socketManager.status == .disconnected || socketManager.status == .notConnected {
socketManager.reconnect()
}
}
}