Datos no enviados desde un background a través de 3G

Tengo una aplicación que envía datos al server mientras la aplicación está en segundo plano. Aquí está el código responsable del envío de datos:

-(bool) sendStats: (MCStatsSender*) val{ if(![self checkInternet]){ //Using Reachability here return false; } NSDictionary *inputData = [NSDictionary dictionaryWithObjectsAndKeys: self.propertyA.value, "key1", val.data, "key2", nil]; [myNetworkManager doRequest:[myRequestManager createWithStringAndDictionary:MY_URL Data:inputData handler:myHandler user:val]]; return true; } 

Entonces, inputData es un dictionary simple con cadenas.

Un método doRequest se basa en un NSURLSession y básicamente se ve así:

 -(void) doRequest: (MCRequest*) request{ [tasks addObject:request]; if(m_session == nil){ NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"key-%lu",reqid]]; m_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; } NSURLSessionDataTask* task = [m_session dataTaskWithRequest:request.generatedRequest]; request.reqId = task.taskIdentifier; [task resume]; } 

Como dije, todo funciona a través de Wi-Fi , la aplicación pasa a segundo plano y, después de unos minutos, un dispositivo bluetooth personalizado envía algunos datos y despierta una aplicación desde un modo suspendido. Una vez que la aplicación iOS ha recibido los datos, no puede enviarlos a un server si un dispositivo está conectado a través de 3G. Estoy seguro de que los datos enviados a través de bluetooth se reciben porque están almacenados en la database local.

También hay otro hecho importante. Si una aplicación se ejecuta a través de Xcode, incluso si un dispositivo está conectado a través de 3G, la aplicación enviará datos desde el background. Para hacer esto, ejecuto una aplicación, luego presiono un button de inicio para ponerlo en segundo plano.

¿No sabes cuál es la diferencia y por qué la aplicación actúa de manera diferente cuando está conectada con un cable a Mac, y por qué los datos no se envían a través de 3G (o incluso 2G)?

Información adicional:

No bash cargar un file, sino simplemente enviar un JSON a un server.

Parece probable que se trate del uso de energía. La carga en segundo plano ofrecida por la session URL es una conveniencia, y se le ofrece a usted en la discresión del sistema operativo: ofrece enviar los datos, pero puede elegir cuándo.

Las cosas que afectan cuándo se enviarán los datos incluyen si el dispositivo está conectado a la alimentación, la calidad de la connection de datos (cuánto time y cuánta potencia se necesitará para enviar los datos), qué más está haciendo el dispositivo (¿puede combinar múltiples cargas) …

Por lo tanto, no puede adivinar ni confiar en que ninguna tarea se realice en un momento determinado mientras se encuentre en segundo plano.

Este tipo de testing debería realizarse realmente solo en un dispositivo y no está conectado a Xcode porque influye en la testing. En su lugar, use algo como Charles proxy para registrar las requestes de networking y usar el dispositivo, dejarlo por períodos de time y tal vez abrir y usar otra aplicación. Deberías ver que los datos se envían eventualmente, pero tendrás que esperar.

    Intereting Posts