CocoaAsyncSocket在后台运行后不起作用

时间:2011-11-01 15:11:33

标签: iphone objective-c ios ipad cocoaasyncsocket

我有一个AsyncSocket的实例,我一直在iPad上用作服务器,然后在另一个充当客户端的iPad上运行的AsyncSocket套接字。我拥有在客户端和服务器之间交换数据的所有必要代码 - 那里没有问题。

我遇到的问题是它一切正常,但在我的应用程序的错误测试期间,我注意到一个特别奇怪(和恼人的问题):

如果我关闭服务器iPad(此时服务器上没有触发任何套接字的代理),则客户端会断开连接(并进入我不断重试的循环)。令人讨厌的是,即使服务器重新启动,客户端仍然无法连接到它。事实上,即使我从头开始重新启动客户端,它仍然无法连接到服务器。我必须重新启动服务器应用程序才能使客户端能够再次连接。

奇怪的是,只有当服务器实际从顶部的按钮“关闭”(即进入待机状态)时才会触发此错误。如果我只是使用主页按钮将应用程序发送到后台,则客户端仍然保持与服务器的连接:只有当设备断开连接时,客户端才会收到断开委托消息并断开连接,然后拒绝重新连接。与此同时,服务器完全没有注意到这一点,根本没有任何委托方法。

概括我的问题:

  • 使用iPad顶部的按钮将设备置于待机状态时,AsyncSocket服务器实例会发生什么变化?
  • 为什么没有触发委托方法,但是任何连接的客户端都会断开连接?
  • 再次开启设备会发生什么?
  • 为什么客户无法重新连接?

1 个答案:

答案 0 :(得分:1)

我设法找到了解决这个问题的方法,所以我将在这里分享: -

在我的服务器类上,我添加了以下内容:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];

然后我添加了以下方法,使套接字再次开始监听:

- (void)applicationDidBecomeActive {
    NSError *error;
    if (![socket acceptOnPort:kPORT error:&error])
    {
        // error code
    }
}

当服务器进入后台时,仍然无法阻止客户端断开连接,所以我只是让它们循环直到服务器再次可用,appEnteredForeground方法将确保服务器在iPad启动后再次开始监听(或者iPhone,我猜)再次打开。