So che se un'app utilizza "Il servizio di cambio di posizione significativo", iOS lo riattiverà se è disponibile un aggiornamento di posizione, anche se l'app viene interrotta.iOS risveglierà l'app terminata se è registrata con la posizione di UIBackgroundModes?
Non sono riuscito a trovare una risposta chiara sul caso se l'app utilizza i servizi di localizzazione standard e specifica la posizione come chiave per UIBackgroundModes: Sarà anche iOS a riattivarlo per consegnare l'aggiornamento anche se è stato terminato? O l'app deve essere in esecuzione in background per ottenere il callback dell'aggiornamento della posizione?
UPDATE: Al momento in cui lo stavo chiedendo, non avevo il tempo di testarlo. Ma dopo aver ottenuto una risposta qui, ho scritto questo pezzo di codice nel delegato della mia applicazione per vedere se la mia app terminata verrà rilanciata quando riceverà un aggiornamento di posizione. Sto visualizzando una UILocalNotification quando ricevo la notifica dell'aggiornamento. Tuttavia, quando ho interrotto la mia app e poi cambiato la mia posizione in città, l'app non è stata riavviata e non ho ricevuto alcun aggiornamento. Puoi dirmi che cosa sto facendo di sbagliato?
UPDATE # 2: Secondo i risultati finali in questo Q & A, non c'è niente di sbagliato in questo codice ed è il comportamento previsto per un'applicazione che utilizza i servizi di localizzazione standard, non deve essere rilanciato dopo la risoluzione.
Ho aggiunto il percorso come uno dei UIBackgroundMode nel file Info.plist.
E questa è la parte correlata localizzazione di mia app delegato:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
m_locManager = [[CLLocationManager alloc] init];
m_locManager.delegate = self;
[m_locManager startUpdatingLocation];
return YES;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[m_locManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog("%@", [NSString stringWithFormat:@"Background Fail %@", [error localizedDescription]]);
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
UILocalNotification * theNotification = [[UILocalNotification alloc] init];
theNotification.alertBody = [NSString stringWithFormat:@"Background location %.06f %.06f %@" , newLocation.coordinate.latitude, newLocation.coordinate.longitude, newLocation.timestamp];
theNotification.alertAction = @"Ok";
theNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
[[UIApplication sharedApplication] scheduleLocalNotification:theNotification];
}
Non sapevo che fosse possibile svegliando un'app, con il valore di upvoted –
Anche in questo caso, NON può essere utilizzato come un trucco per riattivare periodicamente l'app! Apple rifiuterà immediatamente la tua app se utilizzi UIBackgroundModes per nessun altro uso rispetto al suo scopo: * Tracciamento della posizione di un utente *. – runmad
@runmad Sì, so che questo dovrebbe essere usato per lo scopo giusto. Il mio è tracciare la posizione dell'utente al fine di inviarlo al server, in modo che il server gli invierà una notifica push se è più vicino a un'area. Considerando il rifiuto dell'app, sarò più sicuro se utilizzo un servizio di cambio di posizione significativo anziché quello standard? – aslisabanci