Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么GCDAsyncSocket连接在设备锁定时被终止,而不是在按下home按钮时被终止?_Ios_Objective C_Tcp_Cocoaasyncsocket - Fatal编程技术网

Ios 为什么GCDAsyncSocket连接在设备锁定时被终止,而不是在按下home按钮时被终止?

Ios 为什么GCDAsyncSocket连接在设备锁定时被终止,而不是在按下home按钮时被终止?,ios,objective-c,tcp,cocoaasyncsocket,Ios,Objective C,Tcp,Cocoaasyncsocket,这发生在设备上,而不是模拟器上。我打开我的应用程序并使用GCDAsyncSocket连接到服务器。当我按下home按钮,将应用程序置于后台,然后切换回应用程序时,插座仍然连接。没问题 但是如果我真的锁定了设备,然后解锁它,即使马上,插座也会断开。-(void)socketDidDisconnect:(GCDAsyncSocket*)sock withError:(NSError*)err{委托方法中的错误表示 错误:错误域=GCDAsyncSocketErrorDomain代码=7“套接字由关闭

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

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

错误:错误域=GCDAsyncSocketErrorDomain代码=7“套接字由关闭 远程对等“UserInfo=0x20051cb0{NSLocalizedDescription=Socket已关闭 通过远程对等}

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

有办法解决这个问题吗

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


似乎对此没有解决方案。目前作为一种解决办法。如果它意外断开连接,我只需重新连接。将保持此问题不被回答,希望出现奇迹。

查看苹果的文档:

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

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


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

你应该尝试对你的应用程序执行后台操作,如下所述:

你需要在插座: 添加
应用程序提供IP语音服务
无需输入您的信息。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];
    }];
}

如果您的应用程序不是VOIP应用程序,则无法将其声明为VOIP应用程序。应用程序将被拒绝。请在否决投票前通读我的评论。这正是我所说的。此外,您希望利用该行为的原因也有(故意将该应用程序声明为VOIP,即使它不是VOIP应用程序),因为它对于您控制环境的私人应用程序或企业分发非常有用。最后但并非最不重要的是,您的答案似乎链接到了我提供的相同信息。请在此处阅读信息中的内容。plist这不起作用。如果您的应用程序没有真正提供VOiP功能,您的应用程序将被拒绝ure.我在私人使用时使用此解决方案。我没有在我的info.plist中添加
voip
密钥。它对我很有效。您有其他解决方案吗?