为什么在锁定设备时会终止GCDAsyncSocket连接,但在按下主屏幕按钮时却不会终止?

Hlu*_*ung 4 tcp objective-c ios cocoaasyncsocket

这发生在设备而不是模拟器上。我打开了我的应用程序,并使用GCDAsyncSocket连接到服务器。当我按下主页按钮,将应用程序置于后台,然后切换回该应用程序时,套接字仍会连接。没问题

但是,如果我实际上锁定了设备,然后立即将其解锁,则插座会断开连接。来自- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {委托方法的错误说...

错误:错误域= GCDAsyncSocketErrorDomain代码= 7“套接字被远程对等方关闭” UserInfo = 0x20051cb0 {NSLocalizedDescription =套接字被远程对等方关闭}

我已经检查了服务器,没有代码明确破坏连接。我认为与iOS相关的事情会在应用程序发送到后台时终止连接。但是,然后,我想知道是否是因为该应用程序已发送到后台,那么为什么主页按钮不会终止连接,而锁定设备却可以呢?

有没有什么办法解决这一问题?

=====当前进度=====

似乎没有解决方案。现在作为解决方法。我只是重新连接,如果它意外断开连接。将使这个问题无法解决,以期创造奇迹。;)

tig*_*loo 5

查看Apple的文档“应用程序状态和多任务处理”

准备处理基于网络的套接字中的连接失败。挂起应用程序时,由于多种原因,系统可能会断开套接字连接。只要您的基于套接字的代码为其他类型的网络故障(例如信号丢失或网络转换)做好了准备,就不会导致任何异常问题。当您的应用恢复时,如果在使用套接字时遇到故障,只需重新建立连接即可。

锁定设备时,iOS可能会决定随时拆除插槽。我有不同的经验,有些插座会保持打开状态一段时间,但迟早会关闭。您必须通过捕获“应用程序将移至后台” /“应用程序将移至前台”状态更改通知来处理它。

一种解决方法是将您的应用声明为VoIP应用。这样可以使连接保持打开状态。但是,如果您的应用程序并未真正实现VoIP功能,而您想将其提交到应用程序商店,则可能会遭到拒绝。

  • 在您投下反对票之前,请先阅读我的评论。这正是我所说的。此外,出于某些原因,您想利用这种行为(即使不是VoIP应用程序,也要故意将该应用程序声明为VoIP),因为它对于您可以控制环境的私有应用程序或企业分发非常有用。最后但并非最不重要的一点是,您的答案似乎链接到我提供的相同信息。 (2认同)