web-dev-qa-db-fra.com

CoreMotion met à jour en arrière-plan

Avec la puce M7 dans les derniers appareils iOS, on peut recevoir une notification par programme lorsque l'utilisateur passe de la stationnaire à la course, à la marche, etc. à l'aide de CMMotionActivityManager. Stava et Runkeeper l'utilisent tous les deux pour mettre en pause automatiquement l'interrogation GPS (éteindre l'antenne GPS) lorsqu'il détecte que l'utilisateur ne se déplace pas via le M7, puis réactiver les mises à jour GPS une fois qu'ils se sont déplacés. Il est capable de le faire pendant que l'application est à l'état d'arrière-plan, ce qui est la clé ici.

Le problème que je rencontre lors de la duplication de cette fonctionnalité est que si je désactive les mises à jour GPS alors que mon application est en arrière-plan, je cesse de recevoir des mises à jour d'activité et je ne peux plus détecter le moment où l'utilisateur se déplace à nouveau via le M7 pour réactiver le GPS. 

Si je laisse le GPS en marche tout le temps, je continuerai à recevoir les mises à jour des mouvements de Core Motion pendant tout le temps où l'application est en arrière-plan.

Je suppose qu'ils ne jouent pas au bruit blanc ou à une autre astuce peu coûteuse pour rester actifs. Comment sont-ils allés à ce sujet?

35
Parrots

RunKeeper utilise effectivement le truc audio pour rester éveillé. Si vous ouvrez le package de l'application et vérifiez son Info.plist, vous verrez qu'il enregistre pour le mode audio en arrière-plan. Voici comment ils envoient des notifications audio périodiques de votre distance, de votre vitesse et de votre allure. C'est aussi la façon dont ils restent éveillés pendant votre course tout en minimisant les pertes de charge de la batterie.

Si vous avez remarqué que l’icône Services de localisation (le triangle dans la barre d’état) disparaît complètement lors de l’utilisation de RunKeeper, ils n’utilisent aucun type de suivi d’emplacement pour effectuer l’exécution en arrière-plan. Même l'activation des géolocalisations et la surveillance des modifications d'emplacement entraîneraient l'apparition de l'icône Services de localisation.

Ils n'utilisent pas non plus le M7 pour rester éveillé, car cela ne fonctionne pas ainsi. Une mise à jour à partir des API CoreMotion liées à M7 ne sortira pas votre application du mode veille. Lorsqu'elles se réveillent, les applications peuvent interroger l'historique de l'activité de mouvement et de l'étape et peut-être essayer de calculer quelque chose, mais je doute que ce soit si précis.

Enfin, notez que les API de pause automatique ont été introduites dans iOS 6 avant la sortie des puces iPhone 5 et M7. Ce sont des concepts orthogonaux.

15
Mike Gottlieb

Ce que j'ai remarqué lorsque vous désactivez le GPS, l'application n'exécutera aucun code en arrière-plan pour iOS 7, cette application semble être à l'état inactif. Il est donc préférable d’utiliser startMonitoringSignificantLocationChanges en arrière-plan et d’obtenir les mises à jour de votre gestionnaire de lieu. Signifie utiliser simultanément le service startUpdatingLocation lors du changement d'état d'utilisateur et startMonitoringSignificantLocationChanges en arrière-plan.

Ainsi, lorsque vous activez le GPS, lorsque vous utiliserez startMonitoringSignificantLocationChanges, votre application recevra 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

Mieux vaut vérifier ici en arrière-plan ce qui ne va pas avec CoreMotion Framework. Et essayez de le redémarrer . Parce que sans périphérique à puce M7 je suis capable de lire la lecture de l’accéléromètre dans un tel cas.

0
Bhumeshwer katre

avez-vous envisagé d'expérimenter avec 

application:performFetchWithCompletionHandler: 

dans le délégué de l'application? Vous ne pouvez pas contrôler combien de fois il est appelé, mais en fonction de l'application, cela peut durer toutes les 15 minutes environ. Vous pouvez ensuite lancer CMMotionActivityManager à partir de là pour interroger les résultats M7.

La fonctionnalité que vous essayez de répliquer n'est pas tout à fait claire, mais la puce M7 enregistre toute l'activité, que votre application soit en cours d'exécution ou non. Vous pouvez donc simplement interroger en arrière-plan et mettre à jour les totaux par étapes ou les types d'activité.

0
Chris Brandow