Reputation: 353
I am trying to implement socket.io-client in swift. It is not working as supposed. I am unable to read any response from the server on my request. My socket is connecting but after that, I am unable to call events and getting their response. Swift 4, Xcode 10
I am using a global class to declare socket functions as 'clsGlobal' and calling socket functions in different viewcontrollers.
import Foundation import UIKit import 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")
}
}
How to know if the server is connected and how to print response from server?
Upvotes: 2
Views: 14983
Reputation: 1
The answer of the author Ronak Adeshara is correct, I try the following code below and it can handle the event sent from the socket server.
// connect to socket server and listen to the event
SocketHelper.shared.connectSocket { (success) in
SocketHelper.Events.search.listen { [weak self] (result) in
// print(result[0])
}
}
SocketHelper.Events.search.emit(params: <--Your Params-->)
Upvotes: -1
Reputation: 41
Please remember that the socketio client in swift is not yet compatible with js socket.io version 3.x.x
(as of 1/21/2021).
This was an issue we came across since we were using the latest socketio version in our node server (3.1.0
). The client will be able to initially connect but will not be able to receive any messages emitted from the server.
We solved our problem by downgrading our server to socketio version 2.4.1
Upvotes: 4
Reputation: 321
I have created a Global for socket Class
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)
}
}
}
How to use
Connect Socket using this code
SocketHelper.shared.connectSocket { (success) in
}
Start Listen event
SocketHelper.Events.search.listen { [weak self] (result) in
// print(result[0])
}
Emit Event
SocketHelper.Events.search.emit(params: <--Your Params-->)
Upvotes: 5