4

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

但是如果我真的锁定了设备然后解锁它,即使是马上,插座也会断开。- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {委托方法的错误说...

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

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

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

===== 当前进展 =====

似乎没有解决方案。现在作为一种解决方法。如果它意外断开连接,我只是重新连接。将保持这个问题悬而未决,希望奇迹出现。;)

4

3 回答 3

5

查看 Apple 的文档“App States and Multitasking”

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

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

一种解决方法是将您的应用程序声明为 VoIP 应用程序。这将允许您保持连接打开。但是,如果您的应用程序没有真正实现 VoIP 功能并且您想将其提交到应用程序商店,您将面临被拒绝的风险。

于 2013-04-17T11:19:28.670 回答
0

您需要在套接字上启用后台:无需App provides Voice over IP services在 info.plist中添加密钥

- (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];
    }];
}
于 2014-12-23T14:10:22.263 回答
-1

您应该按照此处所述尝试为您的应用程序后台执行:当 iOS 应用程序进入后台时,冗长的任务是否暂停?

于 2013-04-17T11:44:42.207 回答