Condividi tramite


Aggiornamento di un'app Xamarin.iOS in background

L'aggiornamento in background è il processo di riattivazione di un'applicazione sospesa o non in esecuzione e l'aggiornamento con il nuovo contenuto. iOS offre tre opzioni per aggiornare il contenuto in background:

  1. Monitoraggio dell'area e servizio modifiche significative della posizione: le API con riconoscimento della posizione attivano gli aggiornamenti in background in base alle modifiche nella posizione dell'utente. Queste API possono essere usate con discrezione per aggiornare il contenuto nelle applicazioni iOS 6 non basate sulla posizione, in cui altre opzioni non sono disponibili.
  2. Recupero in background (iOS 7+): approccio temporale all'aggiornamento di contenuto non critico che aggiorna frequentemente .
  3. Notifiche remote (iOS 7+): le applicazioni che ricevono notifiche push possono usare le notifiche per attivare gli aggiornamenti del contenuto in background. Questo metodo può essere usato per eseguire l'aggiornamento con contenuto importante e sensibile al tempo che viene aggiornato sporadicamente .

Le sezioni seguenti illustrano le nozioni di base di queste opzioni.

Monitoraggio dell'area e modifiche significative della posizione

iOS offre due API che supportano la posizione con funzionalità di background:

  1. Il monitoraggio dell'area è il processo di configurazione delle aree con limiti e riattivazione del dispositivo quando l'utente entra o esce da un'area. Le aree sono circolari e possono essere di dimensioni variabili. Quando l'utente supera un limite di area, il dispositivo si riattiva per gestire l'evento, in genere attivando una notifica o avviando un'attività. Il monitoraggio dell'area richiede gps e aumenta l'utilizzo della batteria e dei dati.
  2. Il servizio Modifiche di posizione significative è un'opzione di risparmio energia più semplice disponibile per i dispositivi con radio cellulare. Un'applicazione in ascolto delle modifiche significative della posizione riceverà una notifica quando il dispositivo cambia torri di cella. Questo servizio può essere usato per riattivare un'applicazione sospesa o terminata e offre la possibilità di verificare la presenza di nuovi contenuti in background. L'attività in background è limitata a circa 10 secondi, a meno che non sia associata a un'attività in background.

Un'applicazione non richiede la posizione UIBackgroundMode per usare queste API che supportano la posizione. Poiché iOS non tiene traccia dei tipi di attività che possono essere eseguite quando il dispositivo viene svegliato dalle modifiche nella posizione dell'utente, queste API offrono una soluzione alternativa per l'aggiornamento del contenuto in background in iOS 6. Tenere presente che l'attivazione degli aggiornamenti in background con le API basate sulla posizione disegnerà le risorse del dispositivo e potrebbe confondere gli utenti che non capiscono perché un'applicazione richiede l'accesso alla propria posizione. Usare la discrezione quando si implementa monitoraggio dell'area o modifiche significative della posizione per l'elaborazione in background nelle applicazioni che non usano già le API di posizione.

Le app che usano il monitoraggio della posizione per l'elaborazione in background espongono un difetto in iOS 6: se le esigenze di un'applicazione non rientrano in una categoria in background necessaria, ha opzioni di background limitate. Con l'introduzione di due nuove API, Background Fetch e Remote Notifications, iOS 7 (e versioni successive) offre opportunità di background per più applicazioni. Le due sezioni successive introducono queste nuove API.

Recupero in background (iOS 7 e versioni successive)

In iOS 6, un'applicazione che entra in primo piano richiede tempo per caricare nuovo contenuto, presentando brevemente agli utenti contenuti già visualizzati. Il recupero in background consente alle applicazioni di caricare nuovi dati prima che un utente avvii l'applicazione e fornisca all'utente il contenuto più aggiornato.

Per implementare il recupero in background, modificare Info.plist e selezionare le caselle di controllo Abilita modalitàin background e Recupero in background:

Edit the Info.plist and check the Enable Background Modes and Background Fetch check boxes

Successivamente, nell'oggetto eseguire l'override AppDelegatedel FinishedLaunching metodo per impostare l'intervallo di recupero minimo. In questo esempio il sistema operativo decide con quale frequenza recuperare il nuovo contenuto:

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
  UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval (UIApplication.BackgroundFetchIntervalMinimum);
  return true;
}

Infine, eseguire il recupero eseguendo l'override AppDelegatedel PerformFetch metodo in e passando un gestore di completamento. Il gestore di completamento è un delegato che accetta :UIBackgroundFetchResult

public override void PerformFetch (UIApplication application, Action<UIBackgroundFetchResult> completionHandler)
{
  // Check for new data, and display it
  ...
  
  // Inform system of fetch results
  completionHandler (UIBackgroundFetchResult.NewData);
}

Al termine dell'aggiornamento del contenuto, si comunica al sistema operativo chiamando il gestore di completamento con lo stato appropriato. iOS offre tre opzioni per lo stato del gestore di completamento:

  1. UIBackgroundFetchResult.NewData - Chiamato quando il nuovo contenuto è stato recuperato e l'applicazione è stata aggiornata.
  2. UIBackgroundFetchResult.NoData - Chiamato quando è stato eseguito il recupero per il nuovo contenuto, ma non è disponibile alcun contenuto.
  3. UIBackgroundFetchResult.Failed - Utile per la gestione degli errori, questo viene chiamato quando il recupero non è riuscito a scorrere.

Le applicazioni che usano il recupero in background possono effettuare chiamate per aggiornare l'interfaccia utente dallo sfondo. Quando l'utente apre l'app, l'interfaccia utente sarà aggiornata e visualizzerà nuovi contenuti. Questo aggiornerà anche lo snapshot del commutatore app dell'applicazione, in modo che l'utente possa vedere quando l'applicazione ha nuovo contenuto.

Importante

Una volta PerformFetch chiamato, l'applicazione ha circa 30 secondi per avviare il download di nuovo contenuto e chiamare il blocco del gestore di completamento. Se questo richiede troppo tempo, l'app verrà terminata. È consigliabile usare il recupero in background con il servizio trasferimento in background durante il download di file multimediali o altri file di grandi dimensioni.

BackgroundFetchInterval

Nel codice di esempio precedente, il sistema operativo decide con quale frequenza recuperare nuovo contenuto impostando l'intervallo minimo di recupero su BackgroundFetchIntervalMinimum. iOS offre tre opzioni per l'intervallo di recupero:

  1. BackgroundFetchIntervalNever - Indica al sistema di non recuperare mai nuovi contenuti. Usare questa opzione per disattivare il recupero in determinate situazioni, ad esempio quando l'utente non ha eseguito l'accesso. Questo è il valore predefinito per l'intervallo di recupero.
  2. BackgroundFetchIntervalMinimum - Consentire al sistema di decidere con quale frequenza recuperare in base ai modelli utente, alla durata della batteria, all'utilizzo dei dati e alle esigenze di altre applicazioni.
  3. BackgroundFetchIntervalCustom - Se si conosce la frequenza con cui il contenuto di un'applicazione viene aggiornato, è possibile specificare un intervallo di sospensione dopo ogni recupero, durante il quale l'applicazione non potrà recuperare nuovo contenuto. Una volta che l'intervallo è in alto, il sistema determinerà quando recuperare il contenuto.

Sia BackgroundFetchIntervalMinimum che BackgroundFetchIntervalCustom si basano sul sistema per pianificare i recupero. Questo intervallo è dinamico, adattandosi alle esigenze del dispositivo e alle abitudini dell'utente singolo. Ad esempio, se un utente controlla un'applicazione ogni mattina e un altro controllo ogni ora, iOS garantirà che il contenuto sia aggiornato per entrambi gli utenti ogni volta che aprono l'applicazione.

Il recupero in background deve essere usato per le applicazioni che vengono aggiornate frequentemente con contenuto non critico. Per le applicazioni con aggiornamenti critici, è consigliabile usare le notifiche remote. Le notifiche remote si basano sul recupero in background e condividono lo stesso gestore di completamento. Di seguito verranno approfondite le notifiche remote.

Notifiche remote (iOS 7 e versioni successive)

Le notifiche push sono messaggi JSON inviati da un provider a un dispositivo tramite il servizio Apple Push Notification (APN).

In iOS 6, una notifica push in ingresso indica al sistema di avvisare l'utente che si è verificato qualcosa di interessante in un'applicazione. Facendo clic sulla notifica, l'applicazione viene estratta dallo stato sospeso o terminato e l'app inizierà ad aggiornare il contenuto. iOS 7 (e versioni successive) estende le normali notifiche push offrendo alle applicazioni la possibilità di aggiornare il contenuto in background prima di notificare all'utente, in modo che l'utente possa aprire l'applicazione e ricevere immediatamente nuovi contenuti.

Per implementare le notifiche remote, modificare Info.plist e selezionare le caselle di controllo Abilita modalità in background e Notifiche remote:

Background Mode set to Enable Background Modes and Remote notifications

Impostare quindi il content-available flag nella notifica push su 1. In questo modo l'applicazione sa di recuperare nuovo contenuto prima di visualizzare l'avviso:

'aps' {
  'content-available': 1,
  'alert': 'Something new has happened in your app!''
}

In AppDelegate eseguire l'override del DidReceiveRemoteNotification metodo per controllare il payload di notifica per il contenuto disponibile e chiamare il blocco del gestore di completamento appropriato:

public override void DidReceiveRemoteNotification (UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
  if([content-available]) {
    // fetch content
    completionHandler (UIBackgroundFetchResult.NewData);
  }
}

Le notifiche remote devono essere usate per gli aggiornamenti non frequenti con contenuto fondamentale per la funzionalità dell'applicazione. Per altre informazioni sulle notifiche remote, vedere la guida alle notifiche push di Xamarin in iOS .

Importante

Poiché il meccanismo di aggiornamento in Remote Notifications è basato sul recupero in background, l'applicazione deve avviare il download di nuovo contenuto e chiamare il blocco del gestore di completamento entro 30 secondi dalla ricezione della notifica o iOS terminerà l'applicazione. È consigliabile associare notifiche remote al servizio trasferimento in background durante il download di file multimediali o altri file di grandi dimensioni in background.

Notifiche remote invisibile all'utente

Le notifiche remote sono un modo semplice per notificare alle applicazioni gli aggiornamenti e avviare il recupero di nuovo contenuto, ma in alcuni casi non è necessario notificare all'utente che qualcosa è cambiato. Ad esempio, se un utente contrassegna un file per la sincronizzazione, non è necessario notificarli ogni volta che il file viene aggiornato. La sincronizzazione dei file non è un evento sorprendente, né richiede l'attenzione immediata dell'utente. Gli utenti si aspettano che il file sia aggiornato quando lo aprono.

Per i casi come quello precedente, iOS consente l'invio invisibile all'utente delle notifiche push, ovvero senza un avviso. Per trasformare una notifica regolare in una notifica invisibile all'utente, è sufficiente rimuovere l'avviso dal payload della notifica:

'aps' {
  'content-available': 1
}

Limiti di velocità

La differenza principale tra le notifiche normali e invisibile all'utente dal punto di vista dello sviluppatore è che i push invisibile all'utente sono limitati. Gli APN ritarderanno il recapito di push invisibile all'utente nel dispositivo se la velocità di push diventa troppo elevata. Ciò consente di garantire che le applicazioni non svuotano le risorse del dispositivo con troppe notifiche invisibile all'utente.

Tuttavia, gli APN consentiranno notifiche invisibile all'utente "piggyback" insieme a una normale notifica remota o a una risposta keep-alive. Poiché le notifiche regolari non sono limitate, possono essere usate per eseguire il push delle notifiche invisibile all'utente dai nomi APN al dispositivo, come illustrato nel diagramma seguente:

Regular notifications can be used to push stored silent notifications from the APNs to the device, as illustrated by this diagram

Importante

Apple incoraggia gli sviluppatori a inviare notifiche push invisibile all'utente ogni volta che l'applicazione richiede e consentire agli APN di pianificare il recapito.

In questa sezione sono stati illustrate le varie opzioni per aggiornare il contenuto in background per eseguire attività che non rientrano in una categoria in background necessaria. A questo punto, vediamo alcune di queste API in azione.

Passaggio successivo: Parte 4 - Procedure dettagliate per lo sfondo di iOS