这发生在设备上而不是模拟器上。我打开了我的应用程序并使用GCDAsyncSocket连接到服务器。当我按下主页按钮,将应用程序放在后台,然后切换回应用程序时,套接字仍然连接。这里没问题。
但如果我实际锁定设备然后解锁它,即使是立即断开连接。来自- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
委托方法的错误说明了......
错误:错误Domain = GCDAsyncSocketErrorDomain Code = 7“Socket关闭 远程对等体“UserInfo = 0x20051cb0 {NSLocalizedDescription = Socket关闭 通过远程同行}
我已经检查过服务器,并且没有明确销毁连接的代码。我认为当iOS被发送到后台时,iOS相关的东西会杀死连接。 但是,我想知道是不是因为应用程序被发送到后台,那么为什么主页按钮不会终止连接而是锁定设备呢?
有什么方法可以解决这个问题吗?
=====当前进展=====
似乎没有解决方案。现在作为一种解决方法。如果它意外断开,我只是重新连接。将保持这个问题没有答案,希望有一个奇迹。 ;)
答案 0 :(得分:4)
查看Apple的文档"App States and Multitasking":
准备好处理基于网络的套接字中的连接失败。当您的应用程序因任何原因被暂停时,系统可能会拆除套接字连接。只要您的基于套接字的代码为其他类型的网络故障(例如丢失信号或网络转换)做好准备,这不会导致任何异常问题。当您的应用程序恢复时,如果在使用套接字时遇到故障,只需重新建立连接即可。
当您锁定设备时,iOS可能会决定随时拆除套接字。我有不同的经历,有些插座可以保持打开一段时间,但它们迟早会被关闭。您将不得不通过捕获“应用程序将移至后台”/“应用程序将移至前台”状态更改通知来处理它。
解决方法是将您的应用声明为VoIP应用。这将允许您保持连接打开。但是,如果您的应用程序没有真正实现VoIP功能,并且您想将其提交到应用程序商店,那么您将面临被拒绝的风险。
答案 1 :(得分:0)
您需要在套接字上启用后台处理:
不一定在info.plist中添加App provides Voice over IP services
密钥
- (void)socket:(GCDAsyncSocket *)socket didConnectToHost:(NSString *)host port:(UInt16)port {
NSLog(@"Socket Did Connect to Host: %@ Port: %hu", host, port);
//allow socket to operate when the iOS application has been backgrounded
[self.socket performBlock:^{
[self.socket enableBackgroundingOnSocket];
}];
}
答案 2 :(得分:-1)
您应该按照此处所述尝试为您的应用执行后台执行:When an iOS application goes to the background, are lengthy tasks paused?