Existe-t-il un moyen d'indiquer manuellement au périphérique d'envoyer une notification de changement d'emplacement significative qui réveillera les applications enregistrées pour cette notification? Ceci est uniquement à des fins de test, et je réalise que cet appel d'API privé serait rejeté lors de sa soumission à l'App Store.
Donc deux réponses:
A) Montez dans un train :-)
B) Utilisez le simulateur. Dans le simulateur iOS 5.x, il existe un menu de débogage comportant un sous-menu d'emplacement. Choisissez l'autoroute en voiture. Le simulateur démarrera alors un voyage imaginaire sur les 280 panoramiques du nord de la Californie. Il vous donne tout sauf la vue: votre application recevra Mises à jour importantes pour le changement d’emplacement , et sera également lancée en arrière-plan si elle est suspendue.
Pour vérifier que vous vous déplacez, lancez safari dans le simulateur, accédez à maps.google.com et cliquez sur le bouton de suivi de ma position. Vous devriez être en mouvement.
Impressionnant! Maintenant, comment résoudre le problème de cycle de vie d'être lancé par le système? Facile! Demandez à xCode d'attendre que votre application soit lancée pour lancer le débogage. Dans le menu Scheme, choisissez edit scheme. Dans l'onglet Exécution et l'onglet Informations, pour le paramètre "Lancer", choisissez: " Attendez que My.app lance ".
Exécutez votre application une fois dans le simulateur afin qu'elle commence à surveiller les mises à jour d'emplacement, puis forcez-la à quitter, de sorte qu'elle soit suspendue. Ajouter un point d'arrêt dans votre application, la fonction de lancement est terminée et attendez. Dès que votre simulateur sera allé assez loin, votre application sera réveillée, votre point d'arrêt atteint et vous serez dans la bonne monnaie.
Mais vraiment, le trajet en train est plus amusant.
Eh bien, j'ai découvert que je pouvais le faire en activant et désactivant le mode Avion et/ou le WiFi. Peut-être lancer l'application avec l'appareil en mode avion, puis fermer l'application et désactiver le mode avion. Cela activera le GPS et forcera l'envoi d'une mise à jour de la position.
Je voulais également tester la relance de mon application terminée, qui utilise une surveillance significative des modifications. J'ai écrit un morceau de code pour qu'il affiche une notification locale lorsqu'il est lancé par une clé d'emplacement dans le dictionnaire des options de lancement.
J'ai couru mon application dans le simulateur. Puis l'a tué de la barre multitâche. Ensuite, je règle l'emplacement du simulateur iOS sur un emplacement personnalisé. J'ai quitté le simulateur et l'ai redémarré. Mon application a reçu la mise à jour significative de l'emplacement et a montré la notification locale.
Je me débattais avec le même problème: comment tester 'startMonitoringSignificantLocationChanges' et vérifier si mon application reçoit des mises à jour d'emplacement en cas de suspension.
Je n'ai pas réussi à intercepter l'exécution sur un point d'arrêt, mais j'ai réussi à voir les résultats de mon implémentation fonctionner en envoyant les nouvelles données d'emplacement au serveur.
L'ensemble du flux: - implémenté avec 'startMonitoringSignificantLocationChanges' et un appel d'API à mon serveur pour mettre à jour la latitude et la longitude de l'emplacement - Définir la fonctionnalité de mode d'arrière-plan des mises à jour de l'emplacement sur true - Exécuter l'application pour que l'emplacement Le gestionnaire est lancé et l'application écoute les changements d'emplacement - Force la fermeture de l'application - Réglez le débogage-> emplacement sur le simulateur sur le lecteur d'autoroute - Cartes ouvertes pour voir si l'emplacement est en train de changer - Attendu sur le serveur pour voir les mises à jour d'emplacement et obtenait de nouveaux résultats toutes les 3 minutes environ
Cependant, je ne suis toujours pas sûr que cela fonctionne assez bien sur un appareil réel.
Je travaille sur Xcode Version 6.0.1 (6A317); testé sur simulateur iPhone 5s (8.0).
Selon votre scénario, je suggérerais deux solutions:
Utilisez une minuterie ou une notification locale qui appelle périodiquement stopMonitoringSignificantLocationChanges suivi de startMonitoringSignificantLocationChanges qui devrait déclencher l'envoi d'un nouvel emplacement vers votre code (peut être le même emplacement qu'auparavant).
Construisez votre propre simulateur GPS que vous démarrez dans les versions de débogage et qui appellera les mêmes méthodes de délégation que le ferait CLLocationManager.
Une chose que j'ai remarquée dans iOS 7 et Xcode 5.1.1: si vous prévoyez que des événements SLC lancent votre application en mode arrière-plan, il est possible que les points d'arrêt définis ne soient pas atteints. Pour moi, parfois, le message NSLog n'est même pas affiché.
Si c'est le cas pour vous, vous pouvez afficher les résultats de NSLog à partir du journal système. Vous pouvez ouvrir le menu System Log du débogage du simulateur iOS.
Dans iOS 4, vous pouvez vous inscrire pour des changements d'emplacement importants. À partir des documents Apple: avec ce service, les mises à jour d’emplacement ne sont générées que lorsque l’emplacement de l’utilisateur change de manière significative; il est donc idéal pour les applications sociales ou les applications qui fournissent à l'utilisateur des informations non critiques et pertinentes pour la localisation. Si l'application est suspendue lorsqu'une mise à jour est effectuée, le système la réveille en arrière-plan pour gérer la mise à jour. Si l'application démarre ce service et est ensuite terminée, le système relance automatiquement l'application lorsqu'un nouvel emplacement devient disponible. Ce service est disponible dans iOS 4 et versions ultérieures, uniquement sur les appareils contenant une radio cellulaire.
Voir les documents Apple ici et ici .
Voici un exemple de code à enregistrer pour les mises à jour de localisation de signification:
- (void)startSignificantChangeUpdates {
// Create the location manager if it doesn't exist
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];
}
Les docs disent: si vous laissez ce service en cours d'exécution et que votre application est suspendue ou résiliée, le service réveille automatiquement votre application lorsque de nouvelles données de localisation arrivent. Au moment du réveil, votre application est mise en arrière-plan et dispose d'un peu de temps pour traiter les données de localisation. Parce que votre application est en arrière-plan, elle doit effectuer un travail minimal et éviter toute tâche (telle que l'interrogation du réseau) qui pourrait l'empêcher de revenir avant l'expiration du délai imparti. Si ce n'est pas le cas, votre demande peut être résiliée.
En ajoutant à la réponse de MagicSeth, si vous devez le tester sur un appareil réel plutôt que sur un simulateur, vous pouvez déclencher un lancement en arrière-plan avec la touche UIApplication.LaunchOptionsKey.location
en désactivant et en réactivant les services de localisation en général> Écran de confidentialité dans l'application Paramètres.