ios - Socket.io 不会按需关闭套接字(并且不允许我的 swift 应用程序再次重新连接到 node.js 服务器)

标签 ios node.js swift sockets socket.io

我正在使用 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/

相关文章:

ios - 自定义 UIPickerView - 限制用户一次只能旋转一个轮子

ios - 使一键更改标签文本以在模式之间切换

ios - 使用我自己的服务器验证 iOS 应用内购买

node.js - 如何使 node.js 应用程序永久运行?

node.js - 读取目录中的所有文件,将它们存储在对象中,并发送对象

ios - UIImageView 无法正确居中

ios - Swift 中的状态栏高度

ios - 当 segue 即将执行到另一个 View Controller 时,prepareForSegue 是否通知 View Controller ?

javascript - 如何在不使用 try--catch 的情况下测试错误处理

swift - 更改单条条项目的背景颜色 - swift?