2012-05-10 7 views
7

Mi aplicación fue rechazado por Apple en tres ocasiones, todas con la misma carta de rechazo, que es:cómo utilizar correctamente la ubicación en segundo plano - aplicación fue rechazado 3 veces

Encontramos 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 las características que requieren una ubicación persistente.

Sería conveniente añadir características que requieren actualizaciones de ubicación mientras la aplicación está en el fondo o quite la "localización" establecer de la clave UIBackgroundModes.

Si decide añadir características que utilizan el modo de ubicación de fondo, favor incluya la siguiente batería de uso descargo de responsabilidad en su aplicación Descripción:

"El uso continuo del funcionamiento del GPS en el fondo puede drásticamente disminución duración de la batería "

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

Ahora, por lo que yo sé que estoy corriendo en el fondo y "hacer algo" ... En mi AppDelegate he 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 comienza un gerente de ubicación y se hace el delegado. Entonces, tengo el siguiente código para el manejo de 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 mi descripción de la aplicación página:

El uso intensivo del GPS en el fondo puede disminuir 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.

¿Falta algo aquí?

+0

¿No significa un "modo de fondo" algo que aún se está ejecutando después de que el usuario salió de la aplicación? – cgull

+0

@thephpdeveloper Gracias por contarme. Siendo bastante nuevo en StackOverflow, no estaba al tanto de este sistema. – Giovanni

+0

@cgull No estoy seguro. Quiero decir, ¿no me estoy registrando para la actualización de ubicación lo suficientemente bueno? Luego, cuando hay una nueva ubicación, mi aplicación se activa en estado activo de fondo y luego tengo la oportunidad de hacer algo, como registrar mi nueva ubicación en mi servidor. Eso es lo que pensé ... – Giovanni

Respuesta

4

En locationManager: didUpdateToLocation: fromLocation: o en updateMyLocationToServer: Debe comprobar 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 utilizar, 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; 
} 

Esta aplicación de manera debe realizar esta tarea por completo.

+6

¿Se aceptó tu aplicación al agregar este código? – theDuncs

+1

No tiene sentido tratar de terminarBackgroundTask dentro del controlador de caducidad, ya finalizó por caducidad. – malhal

+1

Escuchar ¡El comentario de @ malhal bajo su propio riesgo! De los documentos de Apple: * Debe usar este controlador para limpiar y marcar el final de la tarea de fondo. ** Si no finaliza la tarea explícitamente, se terminará la aplicación. *** https://developer.apple.com/reference/uikit/uiapplication/1623031-beginbackgroundtask – mxcl

7

Esta pregunta es viejo y ya ha respondido, pero usted no necesita la clave UIBackgroundModes si recoge ubicaciones utilizando el API startMonitoringSignificantLocationChanges

+0

Recibí el mismo rechazo que se indicó anteriormente, pero cuando saqué mi Los modos UIBackground, mis startMonitoringSignificantLocationChanges nunca se llaman y veo desaparecer la flecha de navegación en la barra del sistema. ¿Alguna idea? –

+0

Te sugiero que hagas una nueva pregunta con todos los detalles de lo que estás haciendo y algunos ejemplos de código. El alcance es demasiado amplio para un comentario de 500 caracteres. Si publica el enlace de su pregunta aquí como un comentario lo echaré un vistazo. Debería funcionar para usted. Esto funciona para mi. – jackslash

1

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

+0

¿Por qué ha proporcionado la misma respuesta exacta nuevamente (http://stackoverflow.com/questions/12690459/apple-rejection-because-uibackgroundmode-location), consulte su respuesta, no solo haga una copia directa. Y los comentarios permanecen de otra respuesta. Esto no es realmente una gran respuesta y este caso ni siquiera responde la pregunta -1 – Popeye

Cuestiones relacionadas