Minuterie d'arrière-plan longue durée iOS avec mode d'arrière-plan "location"

Je veux mettre en application le temporisateur d'arrière-plan long-coureur qui envoie l'location de l'user au server périodiquement.

Pour ce faire, je définis le mode de location pour UIBackgroundModes , et appelle beginBackgroundTaskWithExpirationHandler lorsque l'application passe en arrière-plan. Et pour CLLocationManager , startUpdatingLocation méthode startUpdatingLocation (je ne veux pas utiliser de changement significatif, car j'ai besoin d'une localization de haute précision).

Mais environ 26 minutes après que l'application passe en arrière-plan, il s'arrête d'envoyer l'location au server. Mais l'application n'est pas écrasée, donc après que j'apporte l'application au premier plan, elle peut reprendre son timer.

26 minutes d'expériences, avec iOS 6.1, iPhone 5.

Voici quelques questions,

  1. Je ne peux pas comprendre pourquoi il suspend après 26mins pas 10mins, ce qui est connu comme la limite de time pour la tâche de fond.

  2. Avant 16mins, backgroundTimeRemaining methods backgroundTimeRemaining returnnent la valeur double max. Mais après 16 minutes, il diminue de 600 , donc il suspend la tâche d'arrière-plan après 10 minutes.

J'ai déjà essayé d'appeler beginBackgroundTaskWithExpirationHandler intérieur du gestionnaire d'expiration, mais pas d'utilisation.

S'il y a quelqu'un qui a la moindre idée de ce problème, cela sera grandement apprécié.

    https://github.com/voyage11/Location

    Utilisez ce code. Vous pouvez définir l'intervalle de time que vous souhaitez appeler. J'ai essayé beaucoup de codes, mais j'ai trouvé ceci comme la question la plus précise et la plus petite de batterie. C'est aussi printingnant pour le service d'endroit de fond. 🙂

    Si vous avez défini UIBackgroundModes avec succès, l'application peut s'exécuter longtime en arrière-plan pendant que vous vous déplacez. Mais, si vous arrêtez de bouger pendant plus de 10 minutes (peut-être plus), l'application sera suspendue par le système. Votre application sera éveillée si l'location est mis à jour, mais cette période d'éveil sera très courte. Vous devez donc beginBackgroundTaskWithExpirationHandler méthode beginBackgroundTaskWithExpirationHandler pour gérer la mise à jour de l'location.