2014-05-07 11 views
7

Con iOS7, è possibile avere completionHandler per le notifiche remote. È possibile fare lo stesso per UILocalNotifications?Utilizzo di UILocalNotifications, notifiche remote con gestore di completamento e recupero in background

In sostanza, desidero che un servizio Web pubblichi i miei dati ad intervalli regolari di 30 secondi, anche se l'app è in background. Per questo ho ritenuto 3 opzioni, ma non ho ricevuto aiuto da qualsiasi:

  1. Background Fetch: Questo funziona in background, ma non posso usarlo come non è obbligatorio che iOS sarà sempre invocare tale contesto prendi i miei intervalli di tempo desiderati.

  2. Notifiche remote: funziona perfettamente. Ma ogni 30 secondi devo pubblicare una notifica PUSH remota, che non è affatto pratica. Inoltre sarà fantastico se potessi gestirlo localmente.

  3. UILocalNotifications: non esiste un gestore di completamento per questo. L'utente DOVRÀ APRIRE l'app. Quindi non funziona così bene!

Ci sono altre opzioni? O anche con iOS7, non è ancora possibile fare qualcosa in locale in background?

Per favore aiuto. Grazie!

+0

Perché è necessario inviare informazioni al server così spesso se l'utente non è nemmeno guardando la vostra applicazione? – Rivera

+0

@Rivera è qualcosa che l'utente inizierà a registrare e dovrebbe continuare anche se l'app è in background. si ferma solo quando l'utente lo ferma. requisito strano, lo so! ma è quello che ho bisogno di costruire! – mayuur

+0

Registrazione cosa? Forse puoi registrare localmente? Apple controllerà quanto consuma la tua app e regolerà la frequenza con cui chiama il tuo metodo di background, quindi è meglio essere "eco" non inviando ancora i dati al server. – Rivera

risposta

5

Hai coperto tutte le opzioni e, come vedi, questo non è supportato. Per buona ragione, soprattutto, il risveglio dell'applicazione in background è un'operazione costosa (in iOS7, viene scattata un'istantanea dopo che le app hanno terminato il lavoro in background), farlo ogni 30 secondi sarebbe devastante per la durata della batteria.

Visto che non hai menzionato quali dati devi inviare, nella maggior parte dei casi ti suggerirei di ridisegnare l'app in modo che fosse amichevole con le batterie degli utenti. Se hai bisogno di rapporti sulla posizione, considera l'ascolto di modifiche significative alla posizione invece della registrazione ogni 30 secondi.

È possibile inviare notifiche push in modo abusivo (nota che le notifiche remote non presidiate sono a tariffa limitata da Apple), ma considerate l'esperienza che i vostri utenti avranno.

Se ritieni che questa funzione debba essere presente e mancante, devi aprire una richiesta di miglioramento con Apple e pubblicare il numero del radar in modo che le persone possano duplicarlo.

2

Il recupero del background è una risposta diretta al tuo problema. Il recupero dello sfondo avvia il tuo gestore di recupero ogni volta che iOS è libero di eseguire periodicamente un'attività. Tutto quello che dovete fare è avviare richiesta NSURLSession in

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler 

NSURLConnection non è più un'API valida per le chiamate di servizio o non supporta sfondo tasking. NSURLSession è chiaramente un'API di sostituzione per NSURLConnection con i suoi vantaggi avanzati di iOS 7.L'aggiunta di seguito, la documentazione dalla documentazione iOS di Apple

NSURLSession is a replacement API for NSURLConnection. It provides 
options that affect the policy of, and various aspects of the 
mechanism by which NSURLRequest objects are retrieved from the 
network. 

Sfondo prendere intervallo può essere impostato per definire la frequenza di ripetizione per lo sfondo recuperare, ma considera anche fattori di risorse del sistema operativo e le operazioni in sospeso

- (void)setMinimumBackgroundFetchInterval:(NSTimeInterval)minimumBackgroundFetchInterval; 

iOS 7 offre chiaramente un modo migliore per aggiornare il contenuto dell'applicazione, ma rispetta le priorità del dispositivo & come generalmente avviene per iOS. Spero che questo risponda alla tua domanda.

1

In realtà, sembra che non si possa comunicare con il webservice a intervalli di tempo regolari dallo sfondo.

UILocalNotifications o Remote Notifications richiedono l'intervento dell'utente per riattivare l'app se è in background. Modificato: A partire da iOS 7.0 notifica remota può svegliare l'applicazione, ma non è una soluzione flessibile

iOS permette più attività in background per le applicazioni che utilizzano uno dei UIBackgroundModes specificati, vedere per favore "Tabella 3-4 modalità di sfondo per apps ":

Here is a link to related Apple docs

Se l'applicazione non è posizionata per una delle bg direttamente modalità, sono d'accordo con Anil Kumar (post precedente) che recuperano sfondo è la cosa più utile qui. Tuttavia non fa completamente ciò di cui hai bisogno. [UIApplication setMinimumBackgroundFetchInterval:] non significa alcun tempo limitato. Significa solo intervallo minimo (o tempo desiderato). Ecco ulteriori informazioni:

performFetchWithCompletionHandler never gets fired

Grazie

+1

Per quanto riguarda le notifiche remote, che ho sbagliato. Se l'utente non ha ucciso specificatamente l'app utilizzando lo scorrimento nel task manager, è possibile utilizzare le notifiche remote per riattivare l'app in background, a condizione che il payload push arrivi a intervalli corretti. Ma è una cattiva idea –

+0

@LeoNatan Concordato, a partire da iOS 7.0 la notifica remota può riattivare l'app. Grazie per il chiarimento. –

Problemi correlati