2012-08-08 15 views
10

¿Es posible realizar solicitudes asincrónicas HTTP al servidor PHP mientras la aplicación está en segundo plano? La aplicación está basada en la ubicación y debe recopilar la ubicación actual y enviar las coordenadas al servidor cada 5 minutos (u otros valores). ¿Puedo hacer que las publicaciones http para el servidor incluso la aplicación esté en segundo plano? Leí muchos pensamientos sobre esto, pero algunos dijeron que se puede hacer, otros que no se pueden hacer.Solicitud HTTP de iOS en segundo plano

Gracias,

Alex.

+0

En primer lugar, no tratar de cobrar la ubicación en un horario fijo . Esto drenará la batería. Simplemente comience a listar los principales cambios de ubicación y, si esto ocurre, envíe la nueva ubicación al servidor. Si necesita una ubicación más precisa, inicie el GPS cuando ocurra el cambio de ubicación principal y pare el GPS cuando tenga la ubicación lo suficientemente precisa para sus necesidades. A continuación, envíe los datos al servidor. – rckoenes

+2

Así lo hice, inicio las ubicaciones de actualización, obtengo la ubicación, dejo de actualizar la ubicación, envío la solicitud al servidor, inicio de nuevo la actualización de la ubicación después de 5 minutos, obtengo la ubicación, me detengo, etc. La pregunta es ¿puedo hacerlo? para enviar la solicitud si la aplicación está en modo de fondo? Gracias. –

Respuesta

16

Se puede hacer pero no es confiable porque le pide al sistema operativo el tiempo para enviar algo y puede aceptar o denegar su solicitud. Esto es lo que he (robado de algún lugar de SO):

[...] //we get the new location from CLLocationManager somewhere here  
BOOL isInBackground = NO; 
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) 
{ 
    isInBackground = YES; 
} 
if (isInBackground) 
{ 
    [self sendBackgroundLocationToServer:newLocation]; 
} 


- (void) sendBackgroundLocationToServer: (CLLocation *) lc 
{ 
    UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid; 
    bgTask = [[UIApplication sharedApplication] 
     beginBackgroundTaskWithExpirationHandler:^{ 
      [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
    }]; 

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:2]; 
    [dictionary setObject:[NSNumber numberWithDouble:lc.coordinate.latitude] forKey:@"floLatitude"]; 
    [dictionary setObject:[NSNumber numberWithDouble:lc.coordinate.longitude] forKey:@"floLongitude"]; 
    // send to server with a synchronous request 


    // AFTER ALL THE UPDATES, close the task 
    if (bgTask != UIBackgroundTaskInvalid) 
    { 
     [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
    } 
} 
+0

Muchas gracias, te declaro el desarrollador del año :). Entonces, básicamente, podría funcionar algunas veces y otras no, depende del sistema operativo. –

+0

puedo probarlo en el simulador. – Dilip

+3

Ese 'isInBackground' es totalmente innecesario. – 2rs2ts

3

Estos enlaces le ayudará a cabo ...

iphone - Connecting to server in background

+0

Gracias, es lo que sugirió vakio, pero sin código: d. Creo que el método beginBackgroundTaskWithExpirationHandler resolverá mi problema. –

Cuestiones relacionadas