在上一篇文章中,已經(jīng)說明如何在Swift下集成WebScoket
但是,WebSocket總是繞不開重連問題,比如手機突然斷網(wǎng),app進入睡眠模式等等
以下是重連方法,在socket單例文件中
import Starscream
import Reachability
let webSocket = WebSocketSingle.shared
var reConnectTime = 0 //設置重連次數(shù)
let reachability = Reachability()! //判斷網(wǎng)絡連接
let hudProgress = AnimateView()
final class WebSocketSingle:NSObject,WebSocketDelegate {
func websocketDidConnect(socket: WebSocketClient) {
//設置重連次數(shù),解決無限重連問題
reConnectTime = 0
}
func websocketDidDisconnect(socket: WebSocketClient, error: Error?) {
//執(zhí)行重新連接方法
socketReconnect()
}
func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
}
func websocketDidReceiveData(socket: WebSocketClient, data: Data) {
print(" WebSocketSingle DidReceiveMessage data:",data)
}
//構(gòu)造單例數(shù)據(jù)
static let shared = WebSocketSingle()
private override init() {
}
}
//socket 重連邏輯
func socketReconnect() {
//判斷網(wǎng)絡情況,如果網(wǎng)絡正常,可以執(zhí)行重連
if reachability.connection != .none {
//設置重連次數(shù),解決無限重連問題
reConnectTime = reConnectTime + 1
if reConnectTime < 5 {
//添加重連延時執(zhí)行,防止某個時間段,全部執(zhí)行
let time: TimeInterval = 2.0
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + time) {
if !SingletonSocket.sharedInstance.socket.isConnected {
SingletonSocket.sharedInstance.socket.connect()
SingletonSocket.sharedInstance.socket.disconnect()
}
}
} else {
//提示重連失敗
}
} else {
//提示無網(wǎng)絡
}
}
//socket主動斷開,放在app進入后臺時,數(shù)據(jù)進入緩存。app再進入前臺,app出現(xiàn)卡死的情況
func socketDisConnect() {
if SingletonSocket.sharedInstance.socket.isConnected {
SingletonSocket.sharedInstance.socket.disconnect()
}
}
然后是使用,放在Appdelegate文件中
//進入后臺模式,主動斷開socket,防止出現(xiàn)處理不了的情況
func applicationWillResignActive(_ application: UIApplication) {
if WebSocketSingle.SingletonSocket.sharedInstance.socket.isConnected {
reConnectTime = 5
webSocket.socketDisConnect()
}
}
//進入前臺模式,主動連接socket
func applicationDidBecomeActive(_ application: UIApplication) {
//解決因為網(wǎng)絡切換或鏈接不穩(wěn)定問題,引起socket斷連問題
//如果app從無網(wǎng)絡,到回復網(wǎng)絡,需要執(zhí)行重連
if !WebSocketSingle.SingletonSocket.sharedInstance.socket.isConnected {
reConnectTime = 0
webSocket.socketReconnect()
}
}