2012-05-10 2 views
7

mia app ottenuto respinto da Apple per tre volte, tutte con la stessa lettera di rifiuto, che è:Come usare correttamente posizione in background - app ottenuto rifiutato 3 volte

Abbiamo scoperto che la vostra applicazione utilizza una modalità di sfondo ma non include la funzionalità che richiede che la modalità venga eseguita in modo persistente. Questo comportamento non è conforme alle Linee guida per la recensione di App Store.

Abbiamo notato che l'app dichiara il supporto per la posizione nella chiaveUIBackgroundModes nel file Info.plist ma non include le funzioni che richiedono la posizione permanente.

Sarebbe opportuno aggiungere funzionalità che richiedono aggiornamenti di posizione mentre l'app è in background o rimuovere l'impostazione "posizione" dalla chiave UIBackgroundModes.

Se si sceglie di aggiungere funzioni che utilizzano la modalità di posizione di sfondo, si prega di includere le seguenti batterie uso dichiarazione di non responsabilità nella vostra Applicazione Descrizione:

"L'uso prolungato del GPS in background può drasticamente diminuzione la durata della batteria ".

Per informazioni sulle modalità di background, fare riferimento alla sezione "Esecuzione del codice in background" nella libreria di riferimento iOS.

Ora, per quanto ne so io sono in esecuzione sullo sfondo e "fare qualcosa" ... Nel mio AppDelegate ho il seguente codice nel 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]; 
    } 
} 

L'AppDelegate inizia anche un responsabile della posizione e si fa delegato. Poi, ho il seguente codice per la gestione degli aggiornamenti sulla posizione sullo sfondo:

- (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]; 
} 

ho anche messo un disclaimer nella mia descrizione dell'app pagina:

uso intensivo del GPS in background può ridurre drasticamente la durata della batteria. Per questo motivo, MY_APP_NAME viene eseguito sullo sfondo solo in attesa di modifiche significative alla posizione.

C'è qualcosa che mi manca qui?

+0

Una "modalità di sfondo" non significa qualcosa che è ancora in esecuzione dopo che l'utente è uscito dall'app? – cgull

+0

@thephpdeveloper Grazie per avermelo detto. Essendo abbastanza nuovo per StackOverflow, non ero a conoscenza di questo sistema. – Giovanni

+0

@cgull Non sono sicuro. Voglio dire, non sta registrando abbastanza bene l'aggiornamento della posizione? Poi, quando c'è una nuova posizione, la mia app si risveglia in stato attivo in background e quindi ho la possibilità di fare qualcosa, come registrare la mia nuova posizione sul mio server. Questo è quello che pensavo ... – Giovanni

risposta

4

In locationManager: didUpdateToLocation: fromLocation: o in updateMyLocationToServer: è necessario verificare se l'applicazione è in stato di background ad es.

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground 

E quindi se la tua app è in modalità background Dovresti usare ad es.

backgroundTask = [[UIApplication sharedApplication] 
        beginBackgroundTaskWithExpirationHandler: 
        ^{ 
         [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; 
        }]; 

/*Write Your internet request code here*/ 

if (bgTask != UIBackgroundTaskInvalid) 
{ 
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; 
    bgTask = UIBackgroundTaskInvalid; 
} 

In questo modo l'applicazione deve eseguire completamente questa attività.

+6

La tua app è stata accettata aggiungendo questo codice? – theDuncs

+1

Non c'è alcun senso nel provare a endBackgroundTask all'interno del gestore di scadenza, era già finito per scadenza – malhal

+1

Ascolta Il commento di @ malhal a tuo rischio e pericolo! Da Apple docs: * Dovresti utilizzare questo gestore per pulire e contrassegnare la fine dell'attività in background. ** La mancata conclusione dell'operazione comporterà la chiusura dell'app. *** https://developer.apple.com/reference/uikit/uiapplication/1623031-beginbackgroundtask – mxcl

7

Questa domanda è vecchia e già risposto, ma non avete bisogno la chiave UIBackgroundModes se si raccolgono posizioni utilizzando l'API startMonitoringSignificantLocationChanges

+0

Ho ricevuto lo stesso rifiuto di cui sopra ma quando prendo il mio Modalità UIBackground, my startMonitoringSignificantLocationChanges non viene mai chiamato e vedo scomparire la freccia di navigazione nella barra di sistema. qualche idea? –

+0

Ti suggerisco di fare una nuova domanda con tutti i dettagli di ciò che stai facendo e alcuni esempi di codice. L'ambito è troppo ampio per un commento di 500 caratteri. Se pubblichi il tuo link di domanda qui come commento, darò un'occhiata a questo. Dovrebbe funzionare per te. Per me funziona. – jackslash

1

startMonitoringSignificantLocationChanges non richiedono una registrazione modalità background. Solo le modifiche di posizione continue fanno.

+0

Perché hai fornito nuovamente la stessa risposta esatta (http://stackoverflow.com/questions/12690459/apple-rejection-because-uibackgroundmode-location), fai riferimento alla tua risposta non limitarti a fare una copia diretta. E i commenti rimangono da altra risposta. Questa non è una gran bella risposta e in questo caso non risponde nemmeno alla domanda -1 – Popeye