ubicación ubicacion segundo remotamente plano desde desactivar como celular activar geolocation app-store appstore-approval

geolocation - ubicacion - Cómo usar correctamente la ubicación en segundo plano: la aplicación fue rechazada 3 veces



ubicacion de red android (3)

En locationManager: didUpdateToLocation: fromLocation: o en updateMyLocationToServer: debe verificar si la aplicación está en estado de fondo, por ejemplo.

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

Y luego, si su aplicación está en modo de fondo, debe usar, por ejemplo.

backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{ [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; }]; /*Write Your internet request code here*/ if (bgTask != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; bgTask = UIBackgroundTaskInvalid; }

De esta forma, la aplicación debería realizar esta tarea por completo.

Mi aplicación fue rechazada por Apple tres veces, todas con la misma carta de rechazo, que es:

Descubrimos que su aplicación utiliza un modo de fondo pero no incluye la funcionalidad que requiere que ese modo se ejecute persistentemente. Este comportamiento no cumple con las Pautas de revisión de App Store.

Notamos que su aplicación declara compatibilidad con la ubicación en la clave UIBackgroundModes en su Info.plist pero no incluye características que requieren una ubicación persistente.

Sería apropiado agregar características que requieren actualizaciones de ubicación mientras la aplicación está en segundo plano o eliminar la configuración de "ubicación" de la clave UIBackgroundModes.

Si elige agregar funciones que usan el Modo de fondo de ubicación, incluya la siguiente exención de responsabilidad de uso de la batería en la Descripción de la aplicación:

"El uso continuo del GPS en segundo plano puede reducir drásticamente la duración de la batería".

Para obtener información sobre los modos de fondo, consulte la sección "Ejecución de código en segundo plano" en la Biblioteca de referencia de iOS.

Ahora, hasta donde sé, me estoy ejecutando en segundo plano y "haciendo algo" ... En mi AppDelegate tengo el siguiente código en didFinishLaunchingWithOptions:

if ([[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsLocationKey] && ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])) { id locationInBackground = [launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]; if ([locationInBackground isKindOfClass:[CLLocation class]]) { [self updateMyLocationToServer:locationInBackground]; } else { //Keep updating location if significant changes CLLocationManager *locationManager = [[CLLocationManager alloc] init]; self.bgLocationManager = locationManager; self.bgLocationManager.delegate = self; self.bgLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; [bgLocationManager startMonitoringSignificantLocationChanges]; } }

El AppDelegate también inicia un administrador de ubicación y se convierte en el delegado. Luego, tengo el siguiente código para manejar las actualizaciones de ubicación en el fondo:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { [self updateMyLocationToServer:newLocation]; } -(void)updateMyLocationToServer:(CLLocation*)myNewLocation { // NSLog(@"Updating Location from the background"); NSString *fbID = [NSString stringWithString:[facebookDetails objectForKey:@"fbID"]]; NSString *firstName = [NSString stringWithString:[facebookDetails objectForKey:@"firstName"]]; NSString *lastName = [NSString stringWithString:[facebookDetails objectForKey:@"lastName"]]; NSString *urlString = [NSString stringWithFormat:@"MY_SERVER_API", fbID, myNewLocation.coordinate.latitude, myNewLocation.coordinate.longitude, firstName, lastName]; NSURL *url = [NSURL URLWithString:urlString]; __block ASIHTTPRequest *newRequest = [ASIHTTPRequest requestWithURL:url]; [newRequest setCompletionBlock:^{ }]; [newRequest setFailedBlock:^{ }]; // [newRequest setDelegate:self]; [newRequest startAsynchronous]; }

También puse un descargo de responsabilidad en la página de descripción de mi aplicación:

El uso intensivo del GPS en segundo plano puede reducir drásticamente la duración de la batería. Por este motivo, MY_APP_NAME se ejecuta en segundo plano solo para escuchar cambios de ubicación significativos.

¿Hay algo que me falta aquí?


Esta pregunta es antigua y ya se respondió, pero no necesita la clave UIBackgroundModes si recopila ubicaciones con la API startMonitoringSignificantLocationChanges


startMonitoringSignificantLocationChanges no requiere un registro en modo de fondo. Solo cambian continuamente las ubicaciones.