快速连接socketIO和选项

时间:2018-09-07 12:39:55

标签: ios swift socket.io

我正在尝试将socketIO用于我的一个项目。 连接到我的socketIO服务器时,我需要使用以下选项。

let socketConfig = SocketIOClientOption.self
socketConfig.forceNew(true)
socketConfig.reconnects(true)
socketConfig.reconnectAttempts(10)
socketConfig.reconnectWait(6000)

根据socketIO文档(https://github.com/socketio/socket.io-client-swift),我无法找到一种在连接时传递SocketIOOptions的方法。 我一直在尝试使用下面的代码进行连接,但是由于缺少这些选项而失败

let manager = SocketManager(socketURL: URL(string: "myurl:9476")!, config: [.log(true), .connectParams(["key":"value"])])
let socket = manager.defaultSocket

使用的SocketIO版本:-'Socket.IO-Client-Swift','〜> 13.3.0'

2 个答案:

答案 0 :(得分:0)

Swift 4中的套接字单例类

import Foundation
import UIKit
import SwiftyJSON
import Alamofire
import SocketIO
import ObjectMapper

typealias  OrderEventResponseBlock = (_ response : Any? , _ type : OrderEventType) -> ()
typealias  TrackResponseBlock = (_ response : Any?) -> ()

class SocketIOManager: NSObject {

    static let shared = SocketIOManager()
    private var manager: SocketManager?
    var socket: SocketIOClient?

    override init() {
        super.init()

        let token = UDSingleton.shared.userData?.userDetails?.accessToken
        guard let URL = URL(string: APIBasePath.basePath) else {return}
        manager = SocketManager(socketURL: URL , config: [.log(true), .connectParams(["access_token" : /token])])
        socket = manager?.defaultSocket
        setupListeners()

    }

    //Server Methods

    func establishConnection() {

        let token = UDSingleton.shared.userData?.userDetails?.accessToken
        if (self.socket?.status == .disconnected || self.socket?.status == .notConnected ) {
            if (token != nil || token != "") {
                socket?.connect()
            }
        }
        else {
            debugPrint("======= Socket already connected =======")
        }
    }

    func closeConnection() {
        debugPrint("=======***** SocketClientEvent.disconnect called ****=======")
        socket?.disconnect()
    }

    func setupListeners() {

        socket?.on(SocketClientEvent.disconnect.rawValue) { [weak self] (array, emitter) in
            debugPrint("======= SocketClientEvent.disconnect listener=======")
          self?.establishConnection()
        }

        socket?.on(SocketClientEvent.error.rawValue) {[weak self] (array, emitter) in
            debugPrint("======= SocketClientEvent.error =======")
          self?.establishConnection()
        }

        socket?.on(SocketClientEvent.connect.rawValue) {  (array, emitter) in
            if self.socket?.status == .connected {
                debugPrint("======= userauth after connected =======")
            }
        }
    }


    func getStatus() -> SocketIOStatus? {
        guard let status = self.socket?.status else{ return nil }
        return status
    }



    //MARK:- Listening Events
    //MARK:-

    func listenOrderEventConnected(_ completionHandler: @escaping OrderEventResponseBlock) {
        socket?.on(SocketEvents.OrderEvent.rawValue) {(arrData, socketAck) in

            guard let item = JSON(arrData[0]).dictionaryObject else {return}

            guard  let type = item["type"] as? String else{return}

            guard let typeSocket :  OrderEventType = OrderEventType(rawValue: type) else {return}

           }
        }


    //MARK:- EmitterWithAcknowledge Events

    func emitMapLocation(_ userData : [String: Any] , _ completionHandler: @escaping TrackResponseBlock) {

        socket?.emitWithAck(SocketEvents.CommonEvent.rawValue , userData).timingOut(after: 4.0, callback: { (response) in
            guard  let item = JSON(response[0]).dictionaryObject else{return}
            let json = JSON(item)
             if json[APIConstants.statusCode.rawValue].stringValue == Validate.successCode.rawValue {
                 let objDriver = Mapper<ApiSucessData<DriverList>>().map(JSONObject: item)
              completionHandler( objDriver?.object)

             }
        })
    }


    func getParticularOrder(_ userData : [String: Any]  , _ completionHandler: @escaping TrackResponseBlock) {

        socket?.emitWithAck(SocketEvents.CommonEvent.rawValue, userData).timingOut(after: 2.0, callback: { (response) in
            let item = JSON(response[0]).dictionaryObject

            let json = JSON(item)

            if json[APIConstants.statusCode.rawValue].stringValue == Validate.successCode.rawValue {
                let objOrder = Mapper<ApiSucessData<Order>>().map(JSONObject: item)
                completionHandler( objOrder?.object)
            }
        })
    }


}

答案 1 :(得分:-1)

我想出了解决方案。 包含选项的方式已在最新版本中进行了修改。 我做了以下工作,并且有效:-

manager  = SocketManager(socketURL:  URL(string:"myurl:123")!, config: [.log(true), .forceNew(true), .reconnectAttempts(10), .reconnectWait(6000), .connectParams(["key":"value"]), .forceWebsockets(true), .compress])
socket = manager?.defaultSocket