Ho un'app che deve segnalare la posizione dell'utente anche se in background o addirittura ucciso (terminato). Il problema è che l'app dovrebbe segnalare la posizione non rara di un intervallo di 1 ora.Aggiornamenti periodici di posizione in background per iOS che dipendono non solo dal cambiamento significativo della posizione
Sto utilizzando il cambio di posizione significativo (SLC) per tenere traccia di tutti i movimenti che è abbastanza quando l'utente è in movimento, ma una volta che l'utente si ferma non vengono sollevati ulteriori aggiornamenti e l'app non ha la possibilità di inviare una nuova posizione (mentre l'utente resta nella stessa area ma senza SLC).
Per coprire questo caso, inizio a utilizzare i recuperi in background per inviare periodicamente gli aggiornamenti in background anche senza SLC). Il problema qui è che i recuperi di sfondo funzionavano abbastanza spesso (ogni 20-30 minuti da quando l'ho usato in un'altra app iOS 7.x) ma ora con iOS8/iOS9 posso ottenerlo solo una volta al giorno o così non è accettabile nel mio caso. Ho eseguito un sacco di test, sviluppato semplice applicazione di recupero di sfondo che aggiunge una notifica locale sul recupero. Non ho fortuna di costringerlo a lavorare più spesso.
Ecco il mio AppDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
return YES;
}
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[[UIApplication sharedApplication] cancelAllLocalNotifications];
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
NSDate *now = [NSDate date];
localNotification.fireDate = now;
localNotification.alertBody = [NSString stringWithFormat:@"Background fetch!"];
localNotification.soundName = UILocalNotificationDefaultSoundName;
NSInteger number = [UIApplication sharedApplication].applicationIconBadgeNumber;
number++;
localNotification.applicationIconBadgeNumber = number;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
completionHandler(UIBackgroundFetchResultNewData);
}
Tutto ciò che viene fatto qui è quello di aggiungere la notifica locale su ogni sfondo recupero. Finisco sempre l'esecuzione in background con UIBackgroundFetchResultNewData.
Hai qualche suggerimento su come forzare il lavoro di background a lavorare più spesso (o dimostrare collegamenti che non è più possibile)? Anche eventuali soluzioni alternative per soddisfare il mio requisito sono ben accette!
Background Fetch ha mai avuto un periodo di esecuzione garantita. Ti suggerisco di inviare push silenziosi sul tuo dispositivo per dargli la possibilità di segnalare la posizione, ma questo non funzionerà se l'app è terminata – Paulw11
Non è mai stato garantito, ma almeno funzionava più spesso. Ci sono stati cambiamenti significativi da quando iOS 7 si è riferito ai recuperi di background? –
Quale valore si restituisce al gestore di completamento? Nuovi dati o nessun nuovo dato? Nella mia esperienza anche su iOS8 non è stato chiamato ogni 20-30 minuti. – Paulw11