¿Por qué la connection GCDAsyncSocket se mata cuando el dispositivo está bloqueado, pero no cuando presiona el button de inicio?

Esto sucede en el dispositivo y no en el simulador. Abrí mi aplicación y me conecté al server usando GCDAsyncSocket. Cuando presiono el button de inicio, colocando la aplicación en segundo plano y luego volviendo a la aplicación, el socket aún se conecta. No hay problema aquí.

Pero si en realidad locking el dispositivo y lo deslocking, incluso de inmediato, el conector se desconecta. El error de - (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err { método de delegado dice …

err: Error Domain = GCDAsyncSocketErrorDomain Code = 7 "Socket cerrado por pares remotos" UserInfo = 0x20051cb0 {NSLocalizedDescription = Socket cerrado por pares remotos}

Me he registrado con el server y no hay ningún código que destruya explícitamente una connection. Creo que es algo relacionado con iOS que mata la connection cuando la aplicación se envía a segundo plano. Pero luego, me pregunto si es porque la aplicación fue enviada a segundo plano, entonces, ¿por qué el button de inicio no elimina la connection sino que bloquea el dispositivo?

¿Hay alguna forma de arreglar esto?

===== Progreso actual =====

Parece que no habrá solución para esto. Por ahora como un trabajo alnetworkingedor. Acabo de volver a conectar si se desconecta inesperadamente. Mantendrá esta pregunta sin respuesta con la esperanza de un milagro. 😉

Consulte la documentation de Apple "Estados de aplicación y multitarea" :

Esté preparado para manejar fallas de connection en sus zócalos basados ​​en networking. El sistema puede destruir conexiones de socket mientras su aplicación está suspendida por varias razones. Siempre que su código basado en socket esté preparado para otros types de fallas de networking, como una señal perdida o una transición de networking, esto no debería ocasionar problemas inusuales. Cuando se reanuda la aplicación, si se produce un error al usar un zócalo, simplemente restablezca la connection.

Cuando bloquea el dispositivo, iOS puede decidir destruir los zócalos en cualquier momento. He realizado diferentes experiencias, algunas tomas permanecen abiertas por un time, pero se cerrarán tarde o temprano. Tendrás que lidiar con esto al captar la "aplicación se moverá a segundo plano" / "la aplicación pasará a primer plano" las notifications de cambio de estado.

Una solución es declarar su aplicación como una aplicación de VoIP. Esto te permitirá mantener abiertas las conexiones. Sin embargo, si su aplicación realmente no implementa funciones de VoIP y desea enviarla a la tienda de aplicaciones, se arriesgará a un rechazo.

necesita habilitar el background en el socket: no es necesario agregar la App provides Voice over IP services key de App provides Voice over IP services en su 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]; }]; } 

Debe probar la ejecución en segundo plano de su aplicación como se describe aquí: cuando una aplicación de iOS pasa a segundo plano, ¿están detenidas las tareas largas?