1、导入
pod 'Socket.IO-Client-Swift', '~> 15.2.0'
iOS使用Socket.IO的版本对应后台版本,不然无法连接
2、引用
import SocketIO
import SocketIO
let manager = SocketManager(socketURL: URL(string: "http://localhost:8080")!, config: [.log(true), .compress])
let socket = manager.defaultSocket
socket.on(clientEvent: .connect) {data, ack in
print("socket connected")
}
socket.on("currentAmount") {data, ack in
guard let cur = data[0] as? Double else { return }
socket.emitWithAck("canUpdate", cur).timingOut(after: 0) {data in
if data.first as? String ?? "passed" == SocketAckValue.noAck {
// Handle ack timeout
}
socket.emit("update", ["amount": cur + 2.50])
}
ack.with("Got your currentAmount", "dude")
}
socket.connect()
以上方法尝试多次,但并无法连接成功!!!!
4、成功连接方式
import SocketIO
class SocketUtil {
let WSURL = URL(string: "http://10.0.41.219:10246")
static let share = SocketUtil()
private var manager:SocketManager?
private var socket:SocketIOClient?
// [] 里面传递需要的字段 ,比如版本号 [ "h": HttpRequestUtil.share.platformVersion]
private var socketHeaders : [String:String] = [:]
private var config:SocketIOClientConfiguration = []
// MARK: - Public
/// 连接socket
public func connect(authorization:String, uid:String){
if manager != nil {
//断开连接
disconnect()
}
config = [
.log(false),//打印日志
.compress,
// 此设置相当重要,因为在拼接到URL后面的时候,怎么都连接不上后台,改为params传值方式的时候,一下就连接上了。
.connectParams(["source":3, "Authorization":authorization, "uid":uid]),
.extraHeaders(socketHeaders),
.reconnects(true), //是否重连机制
.reconnectWaitMax(100) //重新连接等待最大秒数
]
manager = SocketManager(socketURL: WSURL!, config: config)
socket = manager?.defaultSocket
socket?.connect()
}
}
以上步骤连接完成后,就可以做通讯处理了
5、以下链接是一个demo
- 在封装内提供了socket连接状态的监听及处理;
- 断线重连处理;
- 主动打开连接处理;
- 监听接收到消息的处理;
- 发送消息处理;
可以完成基本的使用了:
https://gitee.com/shouny/test-socket.git