Swift WebSocket 重連問題,并判斷網(wǎng)絡情況

在上一篇文章中,已經(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()
        }
    }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容