iOS 7 SDK Utilisation de la récupération en arrière-plan

Ce tutoriel vous apprendra à utiliser Background Fetch, une API multitâche fournie avec le SDK iOS 7. Pour ce faire, nous allons créer une simple liste de plats délicieux automatiquement récupérés en arrière-plan. Continuer à lire!


Aperçu du projet

Background Fetch est une fonctionnalité géniale proposée par iOS 7. Aujourd'hui, nous vivons dans un monde social et la plupart de nos utilisateurs ont plusieurs applications de réseau social sur leurs appareils mobiles. Cependant, chaque fois que l'utilisateur ouvre chaque application, il doit généralement attendre que l'application se mette à jour pour afficher le contenu plus récent. Cela peut être douloureux si plusieurs applications et profils sont utilisés. Maintenant, avec la récupération en arrière-plan, tout le contenu peut être automatiquement récupéré et mis à jour avant que l'utilisateur ne charge l'application..

L'application Trafic par défaut est un exemple simple de la manière dont la récupération en arrière-plan fonctionne. Si vous le vérifiez tous les matins, par exemple à 8 h 20, votre application iOS doit obtenir cette information à ce moment-là. Désormais, si le système d'exploitation sait que vous allez accéder à l'application vers 8h20, il peut récupérer les données à l'avance et les avoir prêtes lorsque vous le souhaitez..

Pour un aperçu plus complet des nouvelles fonctionnalités multitâches, assurez-vous de lire notre introduction à ce sujet. La suite de ce didacticiel sera consacrée à un projet pratique qui montre comment implémenter la récupération en arrière-plan..

1. Configuration du projet

La première étape consiste à créer un projet iOS 7 et à choisir une application à vue unique. Ensuite, ajoutons quelques propriétés qui seront utiles tout au long du tutoriel:

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

le NSMutablearray les objets seront utilisés pour sauvegarder les objets listés dans TableView. Notez que, dans ce didacticiel, vous n’appellerez aucun service pour obtenir des données. Au lieu de cela, vous utiliserez le possibleTableData tableau et en choisir au hasard plusieurs objets. Cependant, l'application peut facilement être améliorée pour récupérer les données d'un serveur si vous le souhaitez..

Le nombre entier numberOfnewPosts représentent les nouveaux articles disponibles chaque fois que vous enregistrez une demande ou recevez une extraction en arrière-plan. le refrestControl est un contrôle utilisé lors de la mise à jour des tâches. Comme il n’est pas dans le contexte du tutoriel, nous ne le couvrirons pas. Cependant, vous devriez consulter ce tutoriel Mobiletuts + si vous souhaitez en savoir plus..

dans le Tableau principal, changer la ViewController à un UITableViewController. Ensuite, cliquez sur le UITableViewController et allez à Éditeur> Incorporer dans> Contrôleur de navigation. N'oubliez pas de définir le cours personnalisé sur ViewController.

Passons maintenant à ViewController.m. la première étape consiste à charger des données. Le code suivant va allouer et créer l'objet de données, créer un titre et initialiser le refreshControl:

 self.possibleTableData = [NSArray arrayWithObjects: @ "Poulet à la lime et à l'ail épicé", @ "Apple Crisp II", @ "Aubergine Parmesan II", @ "Petits gâteaux citrouille au gingembre", @ "Easy Lasagna", @ "Puttanesca", @ " Sauce Alfredo ", nil]; self.navigationItem.title = @ "Plats délicieux"; self.refreshControl = [[UIRefreshControl alloc] init]; [self.refreshControl addTarget: action propre: @selector (insertNewObject :) pourControlEvents: UIControlEventValueChanged]; [self.tableView addSubview: self.refreshControl];

Le code ci-dessus générera un avertissement car le insertNewObject méthode est manquant. Résolvons cela!

La méthode générera un nombre aléatoire et obtiendra le même nombre d'objets du tableau de données. Ensuite, il mettra à jour la table avec de nouvelles valeurs.

 - (void) insertNewObject: (id) expéditeur self.numberOfnewPosts = [self getRandomNumberBetween: 0 à: 4]; NSLog (@ "% d nouveaux objets récupérés", self.numberOfnewPosts); pour (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]; 

le getRandomNumberBetween avertissement sera supprimé lorsque vous ajoutez la méthode suivante:

 -(int) getRandomNumberBetween: (int) de to: (int) to return (int) de + arc4random ()% (to-from + 1); 

Pour charger les objets sur le NSArray objet, nous devons implémenter les méthodes de délégation du 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" pourIndexPath:; cell.textLabel.text = self.objects [indexPath.row]; si (indexPath.row < self.numberOfnewPosts) cell.backgroundColor = [UIColor yellowColor];  else cell.backgroundColor = [UIColor whiteColor]; return cell; 

Assez simple, non? Si vous Courir le projet, vous aurez une interface similaire à l'image suivante:



2. Fetch de fond

Maintenant, vous voulez créer la fonctionnalité de recherche en arrière-plan. Pour rendre la récupération en arrière-plan disponible, vous devez aller à Projet> Capacités> Activer les modes de fond puis sélectionnez Recherche en arrière-plan, comme présenté dans la figure suivante:


Cependant, cela ne suffit pas. Par défaut, l’application n’appellera jamais l’API d’arrière-plan. Vous devez donc ajouter la ligne suivante à -Application (BOOL): application (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions méthode dans le AppDelegate.m fichier:

 [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum];

Cela permettra au système de décider quand il devrait recevoir du nouveau contenu..

Maintenant que votre application sait déjà lancer la récupération en arrière-plan, expliquons-lui ce qu'il faut faire. La méthode -application (void): application (UIApplication *) performFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler aidera à le faire. Cette méthode est appelée chaque fois qu’une extraction en arrière-plan est effectuée et doit être incluse dans la AppDelegate.m fichier. La version complète est fournie ci-dessous:

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

Ensuite, vous devez également importer le ViewController fichier d'en-tête dans le AppDelegate.m classe.

 #import "ViewController.h"

Notez que le insertNewObjectForFetchWithCompletionHandler n'a pas encore été créé. Alors, passons à la ViewController.h et le déclarer.

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

Concentrez maintenant votre attention sur le fichier d'implémentation. La mise en œuvre est très similaire à la insertNewObject appel ajouté avant. Cependant, nous utilisons le AchèvementHandler pour parler au système et nous dire si l'application a récupéré de nouvelles données ou si aucune donnée n'était disponible.

 - (void) insertNewObjectForFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler NSLog (@ "Mettre à jour la vue de table."); self.numberOfnewPosts = [self getRandomNumberBetween: 0 to: 4]; NSLog (@ "% d nouveaux objets récupérés", self.numberOfnewPosts); pour (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); 

À ce stade, le code doit être complété. Maintenant, simulons un test et vérifions que tout est opérationnel!


3. Fetch d'arrière-plan simulé

Donc, si vous voulez vous assurer que tout est configuré, vous devez éditer votre Schémas. Aller au Schémas liste et cliquez sur le Gérer les schémas comme le montre la figure suivante:


Sous le Schémas section de gestion, vous pouvez dupliquer le schéma de votre application:


Après la duplication du schéma, une nouvelle fenêtre sera présentée. Vous pouvez changer son nom de la Onglet Options. Vérifier la Lancer en raison d'un événement d'extraction en arrière-plan boîte. Maintenant, cliquez simplement D'accord dans toutes les fenêtres.


Ensuite, exécutez l'application en utilisant le schéma dupliqué.
Notez que l'application ne s'ouvrira pas au premier plan, mais qu'elle aurait déjà dû récupérer du contenu. Si vous ouvrez l'application et que plusieurs recettes sont déjà disponibles, cela signifie que vous avez réussi! Pour forcer une extraction en arrière-plan, vous pouvez également utiliser Débogage> Simuler une extraction en arrière-plan. depuis le menu Xcode.


Conclusion

À la fin de ce didacticiel, vous devez comprendre le mécanisme d'extraction en arrière-plan et comment l'implémenter dans vos propres applications..

Si vous avez des questions, s'il vous plaît laissez-les dans la section commentaires ci-dessous!