【问题标题】:Implement socket.io-client in swift快速实现 socket.io-client
【发布时间】:2019-08-06 04:38:59
【问题描述】:

我正在尝试快速实现 socket.io-client。它没有按预期工作。我无法读取服务器对我的请求的任何响应。我的套接字正在连接,但在那之后,我无法调用事件并获得他们的响应。 斯威夫特 4,Xcode 10

我正在使用一个全局类将套接字函数声明为“clsGlobal”并在不同的视图控制器中调用套接字函数。

导入基础 导入 UIKit 导入 SocketIO

class clsSocket: NSObject {

let appdelegate = UIApplication.shared.delegate as! AppDelegate

static var manager = SocketManager(socketURL: URL(string: "my url")!, config: [.log(true), .reconnects(true)])
static var socket = manager.defaultSocket

static func ConnectSocket(){


    socket.connect()
    print(socket.status)

    socket.on("locationsUpdate", callback: { data,ack in
        print(data)
        let resp = data[0] as! Any
        print(resp)
    })
}
static func updateLocation(dId:NSNumber, uId:NSNumber, distance:Double){
    let datafield : [String:Any] = ["id":dId,
                                    "userid": uId,
                                    "travelledDistance":distance
    ]
    let data = try? JSONSerialization.data(withJSONObject: datafield)
    if socket.status == .connected {
        socket.emit("updateLocation",  data!)
        socket.emit("requestLocations")
    }

}
static func dogDisconnect(dogid:NSNumber, userid:NSNumber){
    let datafield = ["dId":did, "uId":userid]
    let dataobj = try? JSONSerialization.data(withJSONObject: datafield)
    socket.emit("disconnect",  dataobj!)
    socket.disconnect()
    socket.off("requestLocations")
}

}

如何知道服务器是否连接以及如何打印来自服务器的响应?

【问题讨论】:

  • 尝试 socket.onAny { response in },否则在您的连接参数中查找错误。我的连接是 manager = SocketManager(socketURL: URL(string: APIConfigs.apiURL)!, config: [.log(false), .reconnects(true), .connectParams(["token": token])])
  • 我试过了,但没用。
  • 没有连接?可能是服务器问题?
  • 我更新了结构...仍然无法正常工作。
  • 为什么所有方法都是静态的?为什么不在 init 中设置令牌?

标签: swift


【解决方案1】:

我已经为套接字类创建了一个全局

import SocketIO

class SocketHelper {

    static let shared = SocketHelper()
    var socket: SocketIOClient!

    let manager = SocketManager(socketURL: URL(string: AppUrls.socketURL)!, config: [.log(true), .compress])

    private init() {
        socket = manager.defaultSocket
    }

    func connectSocket(completion: @escaping(Bool) -> () ) {
        disconnectSocket()
        socket.on(clientEvent: .connect) {[weak self] (data, ack) in
            print("socket connected")
            self?.socket.removeAllHandlers()
            completion(true)
        }
        socket.connect()
    }

    func disconnectSocket() {
        socket.removeAllHandlers()
        socket.disconnect()
        print("socket Disconnected")
    }

    func checkConnection() -> Bool {
        if socket.manager?.status == .connected {
            return true
        }
        return false

    }

    enum Events {

        case search

        var emitterName: String {
            switch self {
            case .searchTags:
                return "emt_search_tags"
            }
        }

        var listnerName: String {
            switch self {
            case .search:
                return "filtered_tags"
            }
        }

        func emit(params: [String : Any]) {
            SocketHelper.shared.socket.emit(emitterName, params)
        }

        func listen(completion: @escaping (Any) -> Void) {
            SocketHelper.shared.socket.on(listnerName) { (response, emitter) in
                completion(response)
            }
        }

        func off() {
            SocketHelper.shared.socket.off(listnerName)
        }
    }
}

如何使用

使用此代码连接套接字

SocketHelper.shared.connectSocket { (success) in

}

开始监听事件

SocketHelper.Events.search.listen { [weak self] (result) in
    // print(result[0])
}

发射事件

SocketHelper.Events.search.emit(params: <--Your Params-->)

【讨论】:

  • 我在回调中没有得到任何数据,但我在日志中得到了数据。
  • 那么,每当你进入一个屏幕时,你需要在viewDidLoad中调用SocketHelper.shared.connectSocket { (success) in }吗?还是只在 AppDeleage 中调用一次?
  • 如果你想在整个应用程序中使用 appDelegate 和特定于屏幕的 viewDidload
  • Lisner 没有解决你们面临的任何问题@RonakAdeshara 谢谢
【解决方案2】:

请记住swift中的socketio客户端还不兼容js socket.io版本3.x.x(截至2021年1月21日)。

这是我们遇到的一个问题,因为我们在节点服务器中使用了最新的 socketio 版本 (3.1.0)。客户端将能够初始连接,但将无法接收从服务器发出的任何消息。

我们通过将服务器降级到socketio版本2.4.1解决了我们的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多