iOS 7 SDK lavorare con Fetch in background

Questo tutorial ti insegnerà come usare Background Fetch, un'API multitasking fornita con l'SDK di iOS 7. Per fare ciò, creeremo un semplice elenco di piatti deliziosi che vengono recuperati automaticamente in background. Continuare a leggere!


Panoramica del progetto

Background Fetch è una fantastica funzionalità rilasciata con iOS 7. Oggi viviamo in un mondo sociale e molti dei nostri utenti hanno diverse app di social network sui loro dispositivi mobili. Tuttavia, ogni volta che l'utente apre ciascuna app, in genere deve attendere fino a quando l'app si aggiorna per visualizzare il contenuto più recente. Questo può essere doloroso se vengono utilizzate diverse app e profili. Ora, con il recupero dello sfondo, tutti i contenuti possono essere recuperati e aggiornati automaticamente prima che l'utente carichi l'app.

L'applicazione di traffico predefinita è un semplice esempio di come Background Fetch opera in azione. Se lo controlli ogni mattina, diciamo alle 8:20 del mattino, la tua app per iOS deve ottenere quelle informazioni in quel momento. Ora, se il sistema operativo sa che accederai all'app circa 8:20 AM, potrà recuperare i dati in anticipo e averli pronti quando lo desideri.

Per una panoramica più completa delle nuove funzionalità multitasking, assicurati di leggere la nostra introduzione a questo argomento. Il resto di questo tutorial sarà dedicato a un progetto pratico che dimostra come implementare Background Fetch.

1. Impostazione del progetto

Il primo passo è creare un progetto iOS 7 e scegliere l'app vista singola. Quindi aggiungiamo alcune proprietà che saranno utili nel tutorial:

 @property (nonatomic) NSMutableArray * oggetti; @property (nonatomic) NSArray * possibleTableData; @property (nonatomic) int numberOfnewPosts; @property (nonatomic) UIRefreshControl * refreshControl;

Il NSMutableArray gli oggetti verranno utilizzati per salvare gli oggetti elencati all'interno di TableView. Nota che in questo tutorial non chiamerai alcun servizio per ottenere dati. Invece, userete il possibleTableData array e scegliere casualmente diversi oggetti da esso. Tuttavia, l'app può essere facilmente migliorata per recuperare i dati da un server, se lo desideri.

L'intero numberOfnewPosts rappresenta i nuovi post disponibili ogni volta che effettui una richiesta o ricevi un recupero in background. Il refrestControl è un controllo che viene utilizzato quando si aggiornano le attività. Dal momento che è fuori dal contesto del tutorial, non lo copriremo. Tuttavia, dovresti dare un'occhiata a questo tutorial su Mobiletuts + se desideri saperne di più.

Nel Main.storyboard, cambiare il ViewController a a UITableViewController. Quindi, fare clic su UITableViewController e vai a Editor> Incorpora in> Controller di navigazione. Non dimenticare di impostare la classe personalizzata su ViewController.

Ora, vai a ViewController.m. il primo passo è caricare alcuni dati. Il seguente codice assegnerà e creerà l'oggetto dati, creerà un titolo e inizializzerà refreshControl:

 self.possibleTableData = [array NSArrayWithObjects: @ "Chicken Lime piccante aglio", @ "Apple Crisp II", @ "Melanzane parmigiano II", @ "Cupcakes zucca allo zenzero", @ "Lasagna facile", @ "Puttanesca", @ " Alfredo Sauce ", nil]; self.navigationItem.title = @ "Delicious Dishes"; self.refreshControl = [[UIRefreshControl alloc] init]; [self.refreshControl addTarget: self action: @selector (insertNewObject :) forControlEvents: UIControlEventValueChanged]; [self.tableView addSubview: self.refreshControl];

Il codice sopra genererà un avvertimento perché il insertNewObject manca il metodo Risolviamolo!

Il metodo genererà un numero casuale e otterrà lo stesso numero esatto di oggetti dall'array di dati. Quindi, aggiornerà la tabella con nuovi valori.

 - (void) insertNewObject: (id) sender self.numberOfnewPosts = [self getRandomNumberBetween: 0 a: 4]; NSLog (@ "% d nuovi oggetti recuperati", self.numberOfnewPosts); per (int i = 0; i < self.numberOfnewPosts; i++) int addPost = [self getRandomNumberBetween:0 to:(int)([self.possibleTableData count]-1)]; [self insertObject:[self.possibleTableData objectAtIndex:addPost]];  [self.refreshControl endRefreshing]; 

Il getRandomNumberBetween l'avviso verrà eliminato quando si aggiunge il seguente metodo:

 -(int) getRandomNumberBetween: (int) da a: (int) a return (int) da + arc4random ()% (a-da + 1); 

Per caricare gli oggetti sul NSArray oggetto, abbiamo bisogno di implementare i metodi delegati del TableView.

 - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView return 1;  - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section return self.objects.count;  - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: @ "Cell" perIndexPath: indexPath]; cell.textLabel.text = self.objects [indexPath.row]; if (indexPath.row < self.numberOfnewPosts) cell.backgroundColor = [UIColor yellowColor];  else cell.backgroundColor = [UIColor whiteColor]; return cell; 

Abbastanza semplice, vero? Se tu Correre Nel progetto avrai un'interfaccia simile alla seguente immagine:



2. Recupera sfondo

Ora, si desidera creare la funzionalità Fetch in background. Per rendere disponibile lo sfondo, devi andare a Progetto> Funzionalità> Attivare le modalità di background e quindi selezionare Background Fetch, come presentato nella figura seguente:


Tuttavia, farlo da solo non è abbastanza. Per impostazione predefinita, l'app non chiamerà mai l'API in background, quindi devi aggiungere la seguente riga a -Applicazione (BOOL): applicazione (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions metodo all'interno del AppDelegate.m file:

 [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum];

Ciò consentirà al sistema di decidere quando dovrebbe ottenere nuovi contenuti.

Ora che la tua app sa già iniziare il recupero in background, diciamo cosa fare. Il metodo -(void) application: (applicazione UIApplication *) performFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler aiuterà a farlo. Questo metodo viene chiamato ogni volta che viene eseguito un recupero dello sfondo e deve essere incluso in AppDelegate.m file. La versione completa è fornita di seguito:

 -(void) application: (UIApplication *) application performFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler UINavigationController * navigationController = (UINavigationController *) self.window.rootViewController; id topViewController = navigationController.topViewController; if ([topViewController isKindOfClass: [ViewController class]]) [(ViewController *) topViewController insertNewObjectForFetchWithCompletionHandler: completionHandler];  else NSLog (@ "Non la classe giusta% @.", [classe topViewController]); completionHandler (UIBackgroundFetchResultFailed); 

Successivamente dovresti anche importare il ViewController file di intestazione nel file AppDelegate.m classe.

 #import "ViewController.h"

Si noti che, il insertNewObjectForFetchWithCompletionHandler non è stato ancora creato. Quindi, passa al ViewController.h e dichiararlo.

 - (void) insertNewObjectForFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler;

Ora focalizza la tua attenzione sul file di implementazione. L'implementazione è molto simile a insertNewObject chiamata aggiunta prima. Tuttavia, usiamo il completionHandler per parlare con il sistema e dirci se l'app ha recuperato nuovi dati o se non erano disponibili dati.

 - (void) insertNewObjectForFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler NSLog (@ "Aggiorna il tableview."); self.numberOfnewPosts = [self getRandomNumberBetween: 0 a: 4]; NSLog (@ "% d nuovi oggetti recuperati", self.numberOfnewPosts); per (int i = 0; i < self.numberOfnewPosts; i++) int addPost = [self getRandomNumberBetween:0 to:(int)([self.possibleTableData count]-1)]; [self insertObject:[self.possibleTableData objectAtIndex:addPost]];  /* At the end of the fetch, invoke the completion handler. */ completionHandler(UIBackgroundFetchResultNewData); 

A questo punto, il codice dovrebbe essere completato. Ora, simuliamo un test e verifichiamo che tutto sia attivo e funzionante!


3. Raccolta di sfondo simulato

Quindi, se vuoi assicurarti che tutto sia configurato, devi modificare il tuo schemi. Vai al schemi lista e clicca sul Gestisci schemi opzione, come presentato nella figura seguente:


Sotto il schemi sezione di gestione è possibile duplicare lo schema della vostra applicazione:


Dopo aver duplicato lo schema verrà presentata una nuova finestra. Puoi cambiare il suo nome dal Scheda Opzioni. Controlla il Avvio a causa di un evento di recupero in background scatola. Ora, basta fare clic Ok in tutte le finestre.


Successivamente, esegui l'app utilizzando lo schema duplicato.
Tieni presente che l'app non si aprirà in primo piano, ma dovrebbe aver già recuperato alcuni contenuti. Se apri l'app e sono già disponibili diverse ricette, significa che ci sei riuscito! Per forzare un recupero dello sfondo, puoi anche usarlo Debug> Simulate Fetch in background. dal menu Xcode.


Conclusione

Alla fine di questo tutorial, dovresti capire il meccanismo di recupero dello sfondo e come implementarlo nelle tue app.

Se avete domande, per favore lasciatele nella sezione commenti qui sotto!