我正在使用 socket.io
库,我已经实现了服务器端(在 node.js
中)。我尝试遵循一个非常简单的场景:
1) 用户建立连接
2) 用户连接到房间
3) 用户断开连接
4) 用户重新连接
我在客户端使用 iOS 应用程序(用 swift
编写)。
我的服务器代码如下:
io.on('connection', function(clientSocket){
console.log('a user connected here');
clientSocket.on('disconnect', function(){
console.log('user disconnected');
});
clientSocket.on('connectUser', function(username){
clientSocket.join(username);
console.log('user ' + username + ' connected to the room.');
});
现在,在我的客户端,我创建了一个负责处理所有套接字内容的类:
class SocketIOManager: NSObject {
static let sharedInstance = SocketIOManager()
var socket: SocketIOClient = SocketIOClient(socketURL: NSURL(string: serverURL)!, options: [.ForceNew(true)])
override init() {
super.init()
}
func establishConnection() {
socket.connect()
}
func closeConnection() {
socket.disconnect()
}
func connectToServerWithNickname(nickname: String) {
print("CONNECTING TO SOCKET SERVER \(nickname)")
socket.emit("connectUser", nickname)
}
}
现在 - 进一步 - 在我的 swift 应用程序中(在 applicationDidBecomeActive
中),我正在调用 builtConnection()
,然后调用 SocketIOManager.sharedInstance.connectToServerWithNickname(username)
.
在我的服务器控制台中我看到:
a user connected here
user 571fc6818451630f5becda9c connected to the room.
在我的 appDelegate
中,我实现了这个函数:
func applicationWillResignActive(application: UIApplication) {
SocketIOManager.sharedInstance.closeConnection()
print("closing sockets")
}
现在,当我将应用程序放在后台时,我会看到正在关闭套接字
,并且在服务器控制台中我会看到用户已断开连接
。
现在是主要问题 - 我想在用户返回应用程序时重新连接他。因此我实现了这个方法:
func applicationDidBecomeActive(application: UIApplication) {
print("application is back to life")
SocketIOManager.sharedInstance.establishConnection()
SocketIOManager.sharedInstance.connectToServerWithNickname(username)
}
但是现在,当我从后台唤醒应用程序时,在我的服务器控制台中,我只能看到此处连接的用户
。所以这条消息:
user 571fc6818451630f5becda9c connected to the room.
丢失,我认为这是因为我的应用程序没有重新连接到套接字。
现在,根据我的阅读,socket.io
确实有问题,人们建议切换到其他库,但我还是想使用它。我在github上发现了这个问题https://github.com/socketio/socket.io-client/issues/251他们建议在客户端使用特定参数。关注此插件的 swift 页面 https://github.com/nuclearace/Socket.IO-Client-Swift我找到了具体的标志:
case ForceNew(Bool) // Will a create a new engine for each connect. Useful if you find a bug in the engine related to reconnects
这就是为什么我在客户端构建套接字的原因:
var socket: SocketIOClient = SocketIOClient(socketURL: NSURL(string: serverURL)!, options: [.ForceNew(true)])
但是,即使在 Socket.IO-Client-Swift
库的官方代码中,断开连接方法上方也有一条注释:
/// Disconnects the socket. Only reconnect the same socket if you know what you're doing.
/// Will turn off automatic reconnects.
public func disconnect() {
DefaultSocketLogger.Logger.log("Closing socket", type: logType)
reconnects = false
didDisconnect("Disconnect")
}
有人知道我该如何处理吗?我想在每次我的应用程序进入后台时关闭套接字,并在我的应用程序进入前台时再次连接到它。谢谢!
最佳答案
在 applicationWillEnterForeground 中添加代码
SocketIOManager.sharedInstance.builtConnection() SocketIOManager.sharedInstance.connectToServerWithNickname(用户名)
关于ios - Socket.io 不会按需关闭套接字(并且不允许我的 swift 应用程序再次重新连接到 node.js 服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37492711/