2015-09-20 12 views
8

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!

+1

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

+0

Non è mai stato garantito, ma almeno funzionava più spesso. Ci sono stati cambiamenti significativi da quando iOS 7 si è riferito ai recuperi di background? –

+1

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

risposta

4

Si è scoperto che i recuperi di sfondo in iOS dipendono molto da ciò che si sta facendo all'interno del gestore, in particolare l'attività di rete. Ecco la lista delle dipendenze, che si dovrebbe prendere in considerazione cercando di capire se e quanto spesso iOS eseguirà il vostro recuperare:

  • tempo speso in gestore
  • risultato (NoData, NewData)
  • gestione degli errori (si vuole essere lanciato meno probabile se il codice si blocca
  • timeout (il tuo esecuzione di codice potrebbe essere interrotta da iOS)
  • consumo di energia attività
  • rete relative al risultato (si deve fare una richiesta di rete quando dice t hai NewData, altrimenti il ​​tuo recupero potrebbe essere eseguito la prossima volta in un giorno o così mai.

applicazioni che scaricano piccole quantità di contenuti in modo rapido, e con precisione riflettere quando hanno dovuto contenuti disponibili per il download, è più probabile di ricevere il tempo di esecuzione in futuro di quanto le applicazioni che richiedono molto tempo per scaricare il loro contenuto o che il contenuto del reclamo era disponibile ma non scaricare nulla.

L'ultimo elemento si è rivelata fondamentale nel mio caso, perché a scopo di test ho dichiarato recupera e mai cercato di scaricare nulla. Una volta che ho iniziato a utilizzare la rete nel gestore, i recuperi di sfondo continuano a funzionare come previsto ogni 15-30 minuti.

di Apple docs: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Problemi correlati