Instructions pour l’utilisation du suivi des visites
Notes
MapControl et les services de carte nécessitent une clé d’authentification de cartes appelée MapServiceToken. Pour plus d’informations sur l’obtention et la définition d’une clé d’authentification de cartes, voir Demander une clé d’authentification de cartes.
La fonctionnalité Visites simplifie le processus de suivi de localisation pour le rendre plus efficace pour les besoins pratiques de nombreuses applications. Une visite est définie comme une zone géographique importante que l’utilisateur entre et sort. Les visites sont similaires aux limites géographiques en ce qu’elles permettent à l’application d’être avertie uniquement lorsque l’utilisateur entre ou quitte certains domaines d’intérêt, éliminant ainsi la nécessité d’un suivi continu de l’emplacement qui peut vider l’autonomie de la batterie. Toutefois, contrairement aux limites géographiques, les zones de visite sont identifiées dynamiquement au niveau de la plateforme et n’ont pas besoin d’être définies explicitement par les applications individuelles. En outre, la sélection des visites dont une application effectuera le suivi est gérée par un seul paramètre de granularité, plutôt que par l’abonnement à des emplacements individuels.
Configuration préliminaire
Avant d’aller plus loin, assurez-vous que votre application est capable d’accéder à l’emplacement de l’appareil. Vous devez déclarer la fonctionnalité dans le Location
manifeste et appeler la méthode Geolocator.RequestAccessAsync pour vous assurer que les utilisateurs accordent des autorisations d’emplacement à l’application. Pour plus d’informations sur la façon de procéder, consultez Obtenir l’emplacement de l’utilisateur .
N’oubliez pas d’ajouter l’espace Geolocation
de noms à votre classe. Cela sera nécessaire pour que tous les extraits de code de ce guide fonctionnent.
using Windows.Devices.Geolocation;
Vérifier la dernière visite
Le moyen le plus simple d’utiliser la fonctionnalité de suivi des visites consiste à récupérer le dernier changement d’état lié à la visite connu. Un changement d’état est un événement journalisé par la plateforme dans lequel l’utilisateur entre/quitte un emplacement important, il y a un mouvement significatif depuis le dernier rapport ou l’emplacement de l’utilisateur est perdu (voir la somme VisitStateChange ). Les changements d’état sont représentés par des instances Geovisit . Pour récupérer le instance Geovisit pour le dernier changement d’état enregistré, utilisez simplement la méthode désignée dans la classe GeovisitMonitor.
Notes
La vérification de la dernière visite journalisée ne garantit pas que les visites sont actuellement suivies par le système. Pour suivre les visites au fur et à mesure, vous devez les surveiller au premier plan ou vous inscrire au suivi en arrière-plan (voir les sections ci-dessous).
private async void GetLatestStateChange() {
// retrieve the Geovisit instance
Geovisit latestVisit = await GeovisitMonitor.GetLastReportAsync();
// Using the properties of "latestVisit", parse out the time that the state
// change was recorded, the device's location when the change was recorded,
// and the type of state change.
}
Analyser un instance Geovisit (facultatif)
La méthode suivante convertit toutes les informations stockées dans un instance Geovisit en chaîne facilement lisible. Il peut être utilisé dans n’importe quel scénario de ce guide pour fournir des commentaires sur les visites signalées.
private string ParseGeovisit(Geovisit visit){
string visitString = null;
// Use a DateTimeFormatter object to process the timestamp. The following
// format configuration will give an intuitive representation of the date/time
Windows.Globalization.DateTimeFormatting.DateTimeFormatter formatterLongTime;
formatterLongTime = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter(
"{hour.integer}:{minute.integer(2)}:{second.integer(2)}", new[] { "en-US" }, "US",
Windows.Globalization.CalendarIdentifiers.Gregorian,
Windows.Globalization.ClockIdentifiers.TwentyFourHour);
// use this formatter to convert the timestamp to a string, and add to "visitString"
visitString = formatterLongTime.Format(visit.Timestamp);
// Next, add on the state change type value
visitString += " " + visit.StateChange.ToString();
// Next, add the position information (if any is provided; this will be null if
// the reported event was "TrackingLost")
if (visit.Position != null) {
visitString += " (" +
visit.Position.Coordinate.Point.Position.Latitude.ToString() + "," +
visit.Position.Coordinate.Point.Position.Longitude.ToString() +
")";
}
return visitString;
}
Surveiller les visites au premier plan
La classe GeovisitMonitor utilisée dans la section précédente gère également le scénario d’écoute des changements d’état sur une période donnée. Pour ce faire, vous pouvez instancier cette classe, inscrire une méthode de gestionnaire pour son événement et appeler la Start
méthode.
// this GeovisitMonitor instance will belong to the class scope
GeovisitMonitor monitor;
public void RegisterForVisits() {
// Create and initialize a new monitor instance.
monitor = new GeovisitMonitor();
// Attach a handler to receive state change notifications.
monitor.VisitStateChanged += OnVisitStateChanged;
// Calling the start method will start Visits tracking for a specified scope:
// For higher granularity such as venue/building level changes, choose Venue.
// For lower granularity in the range of zipcode level changes, choose City.
monitor.Start(VisitMonitoringScope.Venue);
}
Dans cet exemple, la méthode gère les OnVisitStateChanged
rapports Visit entrants. Le instance Geovisit correspondant est transmis via le paramètre d’événement.
private void OnVisitStateChanged(GeoVisitWatcher sender, GeoVisitStateChangedEventArgs args) {
Geovisit visit = args.Visit;
// Using the properties of "visit", parse out the time that the state
// change was recorded, the device's location when the change was recorded,
// and the type of state change.
}
Lorsque l’application a terminé la surveillance des modifications d’état liées à la visite, elle doit arrêter le moniteur et annuler l’inscription des gestionnaires d’événements. Cela doit également être effectué chaque fois que l’application est suspendue ou fermée.
public void UnregisterFromVisits() {
// Stop the monitor to stop tracking Visits. Otherwise, tracking will
// continue until the monitor instance is destroyed.
monitor.Stop();
// Remove the handler to stop receiving state change events.
monitor.VisitStateChanged -= OnVisitStateChanged;
}
Surveiller les visites en arrière-plan
Vous pouvez également implémenter la surveillance des visites dans une tâche en arrière-plan, afin que l’activité liée à la visite puisse être gérée sur l’appareil même lorsque votre application n’est pas ouverte. Il s’agit de la méthode recommandée, car elle est plus polyvalente et économe en énergie.
Ce guide utilise le modèle dans Créer et inscrire une tâche en arrière-plan hors processus, dans laquelle les fichiers d’application main vivent dans un projet et le fichier de tâches en arrière-plan réside dans un projet distinct dans la même solution. Si vous débutez dans l’implémentation de tâches en arrière-plan, il est recommandé de suivre ces instructions principalement, en effectuant les substitutions nécessaires ci-dessous pour créer une tâche en arrière-plan de gestion des visites.
Notes
Dans les extraits de code suivants, certaines fonctionnalités importantes telles que la gestion des erreurs et le stockage local sont absentes par souci de simplicité. Pour une implémentation robuste de la gestion des visites en arrière-plan, consultez l’exemple d’application.
Tout d’abord, vérifiez que votre application a déclaré des autorisations de tâche en arrière-plan. Dans l’élément Application/Extensions
de votre fichier Package.appxmanifest , ajoutez l’extension suivante (ajoutez un Extensions
élément s’il n’en existe pas déjà).
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.VisitBackgroundTask">
<BackgroundTasks>
<Task Type="location" />
</BackgroundTasks>
</Extension>
Ensuite, dans la définition de la classe de tâche en arrière-plan, collez le code suivant. La Run
méthode de cette tâche en arrière-plan passe simplement les détails du déclencheur (qui contiennent les informations de visites) dans une méthode distincte.
using Windows.ApplicationModel.Background;
namespace Tasks {
public sealed class VisitBackgroundTask : IBackgroundTask {
public void Run(IBackgroundTaskInstance taskInstance) {
// get a deferral
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
// this task's trigger will be a Geovisit trigger
GeovisitTriggerDetails triggerDetails = taskInstance.TriggerDetails as GeovisitTriggerDetails;
// Handle Visit reports
GetVisitReports(triggerDetails);
finally {
deferral.Complete();
}
}
}
}
Définissez la GetVisitReports
méthode quelque part dans cette même classe.
private void GetVisitReports(GeovisitTriggerDetails triggerDetails) {
// Read reports from the triggerDetails. This populates the "reports" variable
// with all of the Geovisit instances that have been logged since the previous
// report reading.
IReadOnlyList<Geovisit> reports = triggerDetails.ReadReports();
foreach (Geovisit report in reports) {
// Using the properties of "visit", parse out the time that the state
// change was recorded, the device's location when the change was recorded,
// and the type of state change.
}
// Note: depending on the intent of the app, you many wish to store the
// reports in the app's local storage so they can be retrieved the next time
// the app is opened in the foreground.
}
Ensuite, dans le main projet de votre application, vous devez effectuer l’inscription de cette tâche en arrière-plan. Créez une méthode d’inscription qui peut être appelée par une action utilisateur ou qui est appelée chaque fois que la classe est activée.
// a reference to this registration should be declared at the class level
private IBackgroundTaskRegistration visitTask = null;
// The app must call this method at some point to allow future use of
// the background task.
private async void RegisterBackgroundTask(object sender, RoutedEventArgs e) {
string taskName = "MyVisitTask";
string taskEntryPoint = "Tasks.VisitBackgroundTask";
// First check whether the task in question is already registered
foreach (var task in BackgroundTaskRegistration.AllTasks) {
if (task.Value.Name == taskName) {
// if a task is found with the name of this app's background task, then
// return and do not attempt to register this task
return;
}
}
// Attempt to register the background task.
try {
// Get permission for a background task from the user. If the user has
// already responded once, this does nothing and the user must manually
// update their preference via Settings.
BackgroundAccessStatus backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
switch (backgroundAccessStatus) {
case BackgroundAccessStatus.AlwaysAllowed:
case BackgroundAccessStatus.AllowedSubjectToSystemPolicy:
// BackgroundTask is allowed
break;
default:
// notify user that background tasks are disabled for this app
//...
break;
}
// Create a new background task builder
BackgroundTaskBuilder visitTaskBuilder = new BackgroundTaskBuilder();
visitTaskBuilder.Name = exampleTaskName;
visitTaskBuilder.TaskEntryPoint = taskEntryPoint;
// Create a new Visit trigger
var trigger = new GeovisitTrigger();
// Set the desired monitoring scope.
// For higher granularity such as venue/building level changes, choose Venue.
// For lower granularity in the range of zipcode level changes, choose City.
trigger.MonitoringScope = VisitMonitoringScope.Venue;
// Associate the trigger with the background task builder
visitTaskBuilder.SetTrigger(trigger);
// Register the background task
visitTask = visitTaskBuilder.Register();
}
catch (Exception ex) {
// notify user that the task failed to register, using ex.ToString()
}
}
Cela établit qu’une classe de tâche en arrière-plan appelée VisitBackgroundTask
dans l’espace de noms Tasks
fera quelque chose avec le type de location
déclencheur.
Votre application doit maintenant être en mesure d’inscrire la tâche en arrière-plan de gestion des visites, et cette tâche doit être activée chaque fois que l’appareil enregistre un changement d’état lié à la visite. Vous devez remplir la logique dans votre classe de tâches en arrière-plan pour déterminer ce qu’il faut faire avec ces informations de changement d’état.
Rubriques connexes
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour