Je veux que mon application continue à continuer à courir en arrière-plan avec des services de localisation. Pour cela, j'ai utilisé: mais quand j'utilise Je veux exécuter l'application en permanence en arrière-plan, détecter des emplacements après un intervalle de temps régulier. P> P> nstimer code> il n'appelle pas
mise à jour code>. J'ai essayé de l'appeler en utilisant une autre méthode, mais elle n'a également appelé qu'une seule fois. P>
3 Réponses :
Je l'ai fait dans une application que je développe. Les minuteries ne fonctionnent pas lorsque l'application est en arrière-plan, mais l'application reçoit constamment les mises à jour de l'emplacement. J'ai lu quelque part dans la documentation (je ne peux pas sembler le trouver maintenant, je posterai une mise à jour lorsque je le fais) qu'une méthode peut être appelée uniquement sur une boucle d'exécution active lorsque l'application est à l'arrière-plan. Le délégué de l'application a une boucle d'exécution active, même dans la BG, vous n'avez donc pas besoin de créer le vôtre pour faire ce travail. [Je ne suis pas sûr que c'est la bonne explication, mais c'est comme ça que j'ai compris à partir de ce que j'ai lu]
Tout d'abord, ajoutez l'objet "Emplacement" pour la clé "Modes de fond" dans l'application de votre application.Plist. Maintenant, ce que vous devez faire est de démarrer les mises à jour de localisation n'importe où dans votre application: p> Suivant, écrivez une méthode pour gérer les mises à jour de l'emplacement,
Dis - (vide) DidupdateToLocation: (CLLOCATION *) Emplacement, dans le délégué de l'application. Ensuite, implémentez la méthode EmplacementManager: DIDUPDATELLOCATION: Fromlocation de CllouerManagerDelegate dans la classe dans laquelle vous avez démarré le gestionnaire de localisation (puisque nous définissons le délégué de l'emplacement à «Self»). Dans cette méthode, vous devez vérifier si l'intervalle de temps après lequel vous devez gérer les mises à jour de l'emplacement s'est écoulée. Vous pouvez le faire en enregistrant l'heure actuelle à chaque fois. Si ce délai est écoulé, appelez la méthode actualisée de votre application déléguée: p> Ceci appellera votre méthode toutes les 5 minutes, même lorsque votre application est en arrière-plan.
IMP: cette implémentation draine la batterie, si la précision de votre position de votre position n'est pas critique, vous devez utiliser [EmplacementManager StartMonitoringSignificantLocalisationLanges] P> Avant d'ajouter ceci à votre application, veuillez lire le Guide de programmation de la localisation de la localisation.
http://developer.apple.com /Library/IOS/#Documentation/USEREXPerience/conceptuelle/localisationAwaRéspg/introduction/introduction.html P> P>
Si je ne me trompe pas, cela n'appellera que DidupDateToLocation toutes les 5 minutes si DidupDatElocalisation est appelée à des intervalles réguliers. Si vous sélectionnez StartMonitoringSignicantChanges et ne vous déplacez pas beaucoup, vous ne recevrez pas de mises à jour sur un intervalle de 5 mn. Correct?
Je sais que c'est très tard pour une réponse. Mais si vous n'avez toujours pas la réponse, voici ce que j'ai fait et mon application fonctionne continuellement à l'arrière-plan.
- (void)applicationDidEnterBackground:(UIApplication *)application { UIApplication *app = [UIApplication sharedApplication]; UIBackgroundTaskIdentifier bgTask = 0; backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(backgroundTask) userInfo:nil repeats:YES]; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; }]; }
Est-ce situé dans l'Appdeleregate, ou peut-être dans n'importe quelle classe?
Oui, ce code est dans Appdelegate. Et je n'ai pas essayé moi-même, mais cela devrait travailler dans n'importe quelle autre classe aussi ...
Il doit y avoir quelque chose que je ne comprends pas, car si je mettez ce code et laissez le fond de méthodeTask vide, mon application s'exécute à l'arrière-plan. Si je supprime votre code, cela ne le fait plus.
Qu'entendez-vous par, votre application ne fonctionne pas en arrière-plan si vous supprimez le code. ?? Avez-vous vérifié en mettant une méthode de journalisation de fond de fond?
Vous pouvez utiliser pour exécuter l'application en arrière-plan pour une tâche particulière.
Cela semble être la même solution que @ Vish_Obj-C posté précédemment. Qu'est-ce que je rate?
Le code a l'air faux. Le bloc capturera la valeur de bgtask code> lors de sa création, qui est 0, ce qui conduit à un
incorrect [APP ENDBACKERTASK: 0] code>. Au lieu de cela, vous voulez probablement avoir une ivar / propriété BGTASKIDD, de sorte que l'affectation peut se propager au bloc.