Freigeben über


Einrichten eines Geofence

Richten Sie einen Geofence-Bereich in Ihrer App ein, und erfahren Sie, wie Sie Benachrichtigungen im Vordergrund und Im Hintergrund behandeln.

Aktivieren der Standortfunktion

  1. Doppelklicken Sie in Projektmappen-Explorer auf "package.appxmanifest", und wählen Sie die Registerkarte "Funktionen" aus.
  2. Überprüfen Sie in der Liste "Funktionen" den Speicherort. Dadurch wird der Paketmanifestdatei die Location Gerätefunktion hinzugefügt.
  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

Geofence eingerichtet

Schritt 1: Anfordern des Zugriffs auf den Standort des Benutzers

Wichtig

Sie müssen den Zugriff auf den Standort des Benutzers mithilfe der RequestAccessAsync-Methode anfordern, bevor Sie versuchen, auf den Standort des Benutzers zuzugreifen. Sie müssen die RequestAccessAsync-Methode aus dem UI-Thread aufrufen, und Ihre App muss sich im Vordergrund befinden. Ihre App kann erst dann auf die Standortinformationen des Benutzers zugreifen, nachdem der Benutzer die Berechtigung für Ihre App erteilt hat.

using Windows.Devices.Geolocation;
...
var accessStatus = await Geolocator.RequestAccessAsync();

Die RequestAccessAsync-Methode fordert den Benutzer zur Berechtigung für den Zugriff auf seinen Standort auf. Der Benutzer wird nur einmal aufgefordert (pro App). Nach dem ersten Erteilen oder Verweigern der Berechtigung fordert diese Methode den Benutzer nicht mehr zur Berechtigung auf. Um den Benutzer bei der Änderung der Standortberechtigungen zu unterstützen, nachdem er dazu aufgefordert wurde, empfehlen wir, einen Link zu den Standorteinstellungen bereitzustellen, wie weiter unten in diesem Thema gezeigt.

Schritt 2: Registrieren für Änderungen am Geofence-Status und Standortberechtigungen

In diesem Beispiel wird eine Switch-Anweisung mit accessStatus (aus dem vorherigen Beispiel) verwendet, um nur zu handeln, wenn der Zugriff auf die Position des Benutzers zulässig ist. Wenn der Zugriff auf den Standort des Benutzers zulässig ist, greift der Code auf die aktuellen Geofences zu, registriert sich für Geofence-Zustandsänderungen und registriert für Änderungen an Standortberechtigungen.

Tipp bei Verwendung eines Geofence-Bereichs, überwachen Sie Änderungen an Standortberechtigungen mithilfe des StatusChanged-Ereignisses aus der GeofenceMonitor-Klasse anstelle des StatusChanged-Ereignisses aus der Geolocator-Klasse. Ein GeofenceMonitorStatus von Disabled entspricht einem deaktivierten PositionStatus - beide geben an, dass die App nicht über die Berechtigung für den Zugriff auf den Standort des Benutzers verfügt.

switch (accessStatus)
{
    case GeolocationAccessStatus.Allowed:
        geofences = GeofenceMonitor.Current.Geofences;

        FillRegisteredGeofenceListBoxWithExistingGeofences();
        FillEventListBoxWithExistingEvents();

        // Register for state change events.
        GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
        GeofenceMonitor.Current.StatusChanged += OnGeofenceStatusChanged;
        break;


    case GeolocationAccessStatus.Denied:
        _rootPage.NotifyUser("Access denied.", NotifyType.ErrorMessage);
        break;

    case GeolocationAccessStatus.Unspecified:
        _rootPage.NotifyUser("Unspecified error.", NotifyType.ErrorMessage);
        break;
}

Heben Sie dann die Registrierung der Ereignislistener auf, wenn Sie von der Vordergrund-App weg navigieren.

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    GeofenceMonitor.Current.GeofenceStateChanged -= OnGeofenceStateChanged;
    GeofenceMonitor.Current.StatusChanged -= OnGeofenceStatusChanged;

    base.OnNavigatingFrom(e);
}

Schritt 3: Erstellen des Geofence-Raums

Jetzt können Sie ein Geofence-Objekt definieren und einrichten. Je nach Ihren Anforderungen gibt es verschiedene Konstruktorüberladungen. Geben Sie im einfachsten Geofence-Konstruktor nur die ID und die Geoshape an, wie hier gezeigt.

// Set the fence ID.
string fenceId = "fence1";

// Define the fence location and radius.
BasicGeoposition position;
position.Latitude = 47.6510;
position.Longitude = -122.3473;
position.Altitude = 0.0;
double radius = 10; // in meters

// Set a circular region for the geofence.
Geocircle geocircle = new Geocircle(position, radius);

// Create the geofence.
Geofence geofence = new Geofence(fenceId, geocircle);

Sie können Ihren Geofence-Bereich weiter optimieren, indem Sie einen der anderen Konstruktoren verwenden. Im nächsten Beispiel gibt der Geofence-Konstruktor die folgenden zusätzlichen Parameter an:

  • MonitoredStates – Gibt an, welche Geofence-Ereignisse Sie empfangen möchten, um Benachrichtigungen für die Eingabe der definierten Region, das Verlassen der definierten Region oder das Entfernen des Geofence-Bereichs zu erhalten.
  • SingleUse – Entfernt den Geofence-Raum, sobald alle Zustände, auf die der Geofence überwacht wird, erfüllt wurden.
  • DwellTime – Gibt an, wie lange der Benutzer sich im definierten Bereich befinden muss, bevor die Enter-/Exit-Ereignisse ausgelöst werden.
  • StartTime – Gibt an, wann die Überwachung des Geofence-Raums gestartet werden soll.
  • Dauer : Gibt den Zeitraum an, für den der Geofence überwacht werden soll.
// Set the fence ID.
string fenceId = "fence2";

// Define the fence location and radius.
BasicGeoposition position;
position.Latitude = 47.6510;
position.Longitude = -122.3473;
position.Altitude = 0.0;
double radius = 10; // in meters

// Set the circular region for geofence.
Geocircle geocircle = new Geocircle(position, radius);

// Remove the geofence after the first trigger.
bool singleUse = true;

// Set the monitored states.
MonitoredGeofenceStates monitoredStates =
                MonitoredGeofenceStates.Entered |
                MonitoredGeofenceStates.Exited |
                MonitoredGeofenceStates.Removed;

// Set how long you need to be in geofence for the enter event to fire.
TimeSpan dwellTime = TimeSpan.FromMinutes(5);

// Set how long the geofence should be active.
TimeSpan duration = TimeSpan.FromDays(1);

// Set up the start time of the geofence.
DateTimeOffset startTime = DateTime.Now;

// Create the geofence.
Geofence geofence = new Geofence(fenceId, geocircle, monitoredStates, singleUse, dwellTime, startTime, duration);

Denken Sie nach dem Erstellen daran, Ihren neuen Geofence-Dienst auf dem Monitor zu registrieren.

// Register the geofence
try {
   GeofenceMonitor.Current.Geofences.Add(geofence);
} catch {
   // Handle failure to add geofence
}

Schritt 4: Behandeln von Änderungen an Standortberechtigungen

Das GeofenceMonitor -Objekt löst das StatusChanged-Ereignis aus, um anzugeben, dass die Standorteinstellungen des Benutzers geändert wurden. Dieses Ereignis übergibt den entsprechenden Status über den Absender des Arguments. Status-Eigenschaft (vom Typ GeofenceMonitorStatus). Beachten Sie, dass diese Methode nicht über den UI-Thread aufgerufen wird und das Dispatcher-Objekt die UI-Änderungen aufruft.

using Windows.UI.Core;
...
public async void OnGeofenceStatusChanged(GeofenceMonitor sender, object e)
{
   await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
   {
    // Show the location setting message only if the status is disabled.
    LocationDisabledMessage.Visibility = Visibility.Collapsed;

    switch (sender.Status)
    {
     case GeofenceMonitorStatus.Ready:
      _rootPage.NotifyUser("The monitor is ready and active.", NotifyType.StatusMessage);
      break;

     case GeofenceMonitorStatus.Initializing:
      _rootPage.NotifyUser("The monitor is in the process of initializing.", NotifyType.StatusMessage);
      break;

     case GeofenceMonitorStatus.NoData:
      _rootPage.NotifyUser("There is no data on the status of the monitor.", NotifyType.ErrorMessage);
      break;

     case GeofenceMonitorStatus.Disabled:
      _rootPage.NotifyUser("Access to location is denied.", NotifyType.ErrorMessage);

      // Show the message to the user to go to the location settings.
      LocationDisabledMessage.Visibility = Visibility.Visible;
      break;

     case GeofenceMonitorStatus.NotInitialized:
      _rootPage.NotifyUser("The geofence monitor has not been initialized.", NotifyType.StatusMessage);
      break;

     case GeofenceMonitorStatus.NotAvailable:
      _rootPage.NotifyUser("The geofence monitor is not available.", NotifyType.ErrorMessage);
      break;

     default:
      ScenarioOutput_Status.Text = "Unknown";
      _rootPage.NotifyUser(string.Empty, NotifyType.StatusMessage);
      break;
    }
   });
}

Einrichten von Vordergrundbenachrichtigungen

Nachdem Ihre Geofences erstellt wurden, müssen Sie die Logik hinzufügen, um zu behandeln, was passiert, wenn ein Geofence-Ereignis auftritt. Abhängig von den von Ihnen eingerichteten MonitoredStates erhalten Sie möglicherweise ein Ereignis, wenn:

  • Der Benutzer gibt eine interessante Region ein.
  • Der Benutzer verlässt eine Interessante Region.
  • Der Geofence-Raum ist abgelaufen oder wurde entfernt. Beachten Sie, dass eine Hintergrund-App für ein Entfernungsereignis nicht aktiviert ist.

Sie können Ereignisse direkt von Ihrer App überwachen, wenn sie ausgeführt oder für eine Hintergrundaufgabe registriert wird, sodass Sie beim Auftreten eines Ereignisses eine Hintergrundbenachrichtigung erhalten.

Schritt 1: Registrieren für Geofence-Zustandsänderungsereignisse

Damit Ihre App eine Vordergrundbenachrichtigung über eine Änderung des Geofence-Zustands empfängt, müssen Sie einen Ereignishandler registrieren. Dies ist in der Regel eingerichtet, wenn Sie den Geofence erstellen.

private void Initialize()
{
    // Other initialization logic

    GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
}

Schritt 2: Implementieren des Geofence-Ereignishandlers

Der nächste Schritt besteht darin, die Ereignishandler zu implementieren. Die hier ausgeführte Aktion hängt davon ab, wofür Ihre App den Geofence-Code verwendet.

public async void OnGeofenceStateChanged(GeofenceMonitor sender, object e)
{
    var reports = sender.ReadReports();

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        foreach (GeofenceStateChangeReport report in reports)
        {
            GeofenceState state = report.NewState;

            Geofence geofence = report.Geofence;

            if (state == GeofenceState.Removed)
            {
                // Remove the geofence from the geofences collection.
                GeofenceMonitor.Current.Geofences.Remove(geofence);
            }
            else if (state == GeofenceState.Entered)
            {
                // Your app takes action based on the entered event.

                // NOTE: You might want to write your app to take a particular
                // action based on whether the app has internet connectivity.

            }
            else if (state == GeofenceState.Exited)
            {
                // Your app takes action based on the exited event.

                // NOTE: You might want to write your app to take a particular
                // action based on whether the app has internet connectivity.

            }
        }
    });
}

Einrichten von Hintergrundbenachrichtigungen

Nachdem Ihre Geofences erstellt wurden, müssen Sie die Logik hinzufügen, um zu behandeln, was passiert, wenn ein Geofence-Ereignis auftritt. Abhängig von den von Ihnen eingerichteten MonitoredStates erhalten Sie möglicherweise ein Ereignis, wenn:

  • Der Benutzer gibt eine interessante Region ein.
  • Der Benutzer verlässt eine Interessante Region.
  • Der Geofence-Raum ist abgelaufen oder wurde entfernt. Beachten Sie, dass eine Hintergrund-App für ein Entfernungsereignis nicht aktiviert ist.

So überwachen Sie ein Geofence-Ereignis im Hintergrund

  • Deklarieren Sie die Hintergrundaufgabe im App-Manifest.
  • Registrieren Sie die Hintergrundaufgabe in Ihrer App. Wenn Ihre App Internetzugriff benötigt, z. B. für den Zugriff auf einen Clouddienst, können Sie eine Kennzeichnung dafür festlegen, wenn das Ereignis ausgelöst wird. Sie können auch ein Kennzeichen festlegen, um sicherzustellen, dass der Benutzer vorhanden ist, wenn das Ereignis ausgelöst wird, damit Sie sicher sind, dass der Benutzer benachrichtigt wird.
  • Während Ihre App im Vordergrund ausgeführt wird, fordern Sie den Benutzer auf, Den App-Standortberechtigungen zu erteilen.

Schritt 1: Registrieren für Geofence-Statusänderungen

Fügen Sie im App-Manifest unter der Registerkarte "Deklarationen " eine Deklaration für eine Hintergrundaufgabe für den Speicherort hinzu. Gehen Sie hierzu folgendermaßen vor:

  • Fügen Sie eine Deklaration vom Typ "Hintergrundaufgaben" hinzu.
  • Legen Sie einen Eigenschaftsaufgabentyp des Speicherorts fest.
  • Legen Sie einen Einstiegspunkt in Ihre App fest, der aufgerufen werden soll, wenn das Ereignis ausgelöst wird.

Schritt 2: Registrieren der Hintergrundaufgabe

Der Code in diesem Schritt registriert die Geofencing-Hintergrundaufgabe. Denken Sie daran, dass beim Erstellen des Geofence-Standorts die Standortberechtigungen überprüft wurden.

async private void RegisterBackgroundTask(object sender, RoutedEventArgs e)
{
    // Get permission for a background task from the user. If the user has already answered once,
    // this does nothing and the user must manually update their preference via PC Settings.
    BackgroundAccessStatus backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();

    // Regardless of the answer, register the background task. Note that the user can use
    // the Settings app to prevent your app from running background tasks.
    // Create a new background task builder.
    BackgroundTaskBuilder geofenceTaskBuilder = new BackgroundTaskBuilder();

    geofenceTaskBuilder.Name = SampleBackgroundTaskName;
    geofenceTaskBuilder.TaskEntryPoint = SampleBackgroundTaskEntryPoint;

    // Create a new location trigger.
    var trigger = new LocationTrigger(LocationTriggerType.Geofence);

    // Associate the location trigger with the background task builder.
    geofenceTaskBuilder.SetTrigger(trigger);

    // If it is important that there is user presence and/or
    // internet connection when OnCompleted is called
    // the following could be called before calling Register().
    // SystemCondition condition = new SystemCondition(SystemConditionType.UserPresent | SystemConditionType.InternetAvailable);
    // geofenceTaskBuilder.AddCondition(condition);

    // Register the background task.
    geofenceTask = geofenceTaskBuilder.Register();

    // Associate an event handler with the new background task.
    geofenceTask.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);

    BackgroundTaskState.RegisterBackgroundTask(BackgroundTaskState.LocationTriggerBackgroundTaskName);

    switch (backgroundAccessStatus)
    {
    case BackgroundAccessStatus.Unspecified:
    case BackgroundAccessStatus.Denied:
        rootPage.NotifyUser("This app is not allowed to run in the background.", NotifyType.ErrorMessage);
        break;

    }
}


Schritt 3: Behandeln der Hintergrundbenachrichtigung

Die Aktion, die Sie ausführen, um den Benutzer zu benachrichtigen, hängt davon ab, was Ihre App tut, aber Sie können eine Popupbenachrichtigung anzeigen, einen Audiosound wiedergeben oder eine Live-Kachel aktualisieren. Der Code in diesem Schritt behandelt die Benachrichtigung.

async private void OnCompleted(IBackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs e)
{
    if (sender != null)
    {
        // Update the UI with progress reported by the background task.
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            try
            {
                // If the background task threw an exception, display the exception in
                // the error text box.
                e.CheckResult();

                // Update the UI with the completion status of the background task.
                // The Run method of the background task sets the LocalSettings.
                var settings = ApplicationData.Current.LocalSettings;

                // Get the status.
                if (settings.Values.ContainsKey("Status"))
                {
                    rootPage.NotifyUser(settings.Values["Status"].ToString(), NotifyType.StatusMessage);
                }

                // Do your app work here.

            }
            catch (Exception ex)
            {
                // The background task had an error.
                rootPage.NotifyUser(ex.ToString(), NotifyType.ErrorMessage);
            }
        });
    }
}


Ändern der Datenschutzeinstellungen

Wenn die Datenschutzeinstellungen für den Standort Ihrer App nicht den Zugriff auf den Standort des Benutzers zulassen, empfehlen wir, einen bequemen Link zu den Datenschutzeinstellungen für den Standort in der Einstellungs-App bereitzustellen. In diesem Beispiel wird ein Hyperlink-Steuerelement verwendet, um zum ms-settings:privacy-location URI zu navigieren.

<!--Set Visibility to Visible when access to the user's location is denied. -->  
<TextBlock x:Name="LocationDisabledMessage" FontStyle="Italic"
                 Visibility="Collapsed" Margin="0,15,0,0" TextWrapping="Wrap" >
          <Run Text="This app is not able to access Location. Go to " />
              <Hyperlink NavigateUri="ms-settings:privacy-location">
                  <Run Text="Settings" />
              </Hyperlink>
          <Run Text=" to check the location privacy settings."/>
</TextBlock>

Alternativ kann Ihre App die LaunchUriAsync-Methode aufrufen, um die Einstellungs-App über Code zu starten. Weitere Informationen finden Sie unter Starten der Windows-Einstellungen.

using Windows.System;
...
bool result = await Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));

Testen und Debuggen Ihrer App

Das Testen und Debuggen von Geofencing-Apps kann eine Herausforderung darstellen, da sie von der Position eines Geräts abhängen. Hier erläutern wir verschiedene Methoden zum Testen von Vordergrund- und Hintergrund-Geofences.

So debuggen Sie eine Geofencing-App

  1. Verschieben Sie das Gerät physisch an neue Speicherorte.
  2. Testen Sie die Eingabe eines Geofence-Bereichs, indem Sie eine Geofence-Region erstellen, die Ihren aktuellen physischen Standort enthält, sodass Sie sich bereits innerhalb des Geofence-Bereichs befinden und das Ereignis "Geofence eingegeben" sofort ausgelöst wird.
  3. Verwenden Sie den Microsoft Visual Studio-Emulator, um Speicherorte für das Gerät zu simulieren.

Testen und Debuggen einer Geofencing-App, die im Vordergrund ausgeführt wird

So testen Sie Ihre Geofencing-App, die im Vordergrund ausgeführt wird

  1. Erstellen Sie Ihre App in Visual Studio.
  2. Starten Sie Ihre App im Visual Studio-Emulator.
  3. Verwenden Sie diese Tools, um verschiedene Standorte innerhalb und außerhalb Ihrer Geofence-Region zu simulieren. Warten Sie unbedingt lange genug, bis die durch die DwellTime-Eigenschaft angegebene Zeit zum Auslösen des Ereignisses liegt. Beachten Sie, dass Sie die Aufforderung akzeptieren müssen, um Standortberechtigungen für die App zu aktivieren. Weitere Informationen zum Simulieren von Standorten finden Sie unter Festlegen der simulierten Geolocation des Geräts.
  4. Sie können den Emulator auch verwenden, um die Größe von Zäunen und Verweilzeiten zu schätzen, die ungefähr bei unterschiedlichen Geschwindigkeiten erkannt werden müssen.

Testen und Debuggen einer geofencing-App, die im Hintergrund ausgeführt wird

So testen Sie Ihre Geofencing-App, die den Hintergrund ausführt

  1. Erstellen Sie Ihre App in Visual Studio. Beachten Sie, dass Ihre App den Hintergrundaufgabentyp "Speicherort " festlegen sollte.
  2. Stellen Sie die App zuerst lokal bereit.
  3. Schließen Sie Ihre App, die lokal ausgeführt wird.
  4. Starten Sie Ihre App im Visual Studio-Emulator. Beachten Sie, dass die Hintergrund-Geofencing-Simulation jeweils nur für eine App innerhalb des Emulators unterstützt wird. Starten Sie nicht mehrere Geofencing-Apps im Emulator.
  5. Simulieren Sie im Emulator verschiedene Standorte innerhalb und außerhalb Ihrer Geofence-Region. Warten Sie unbedingt lange genug über die DwellTime , um das Ereignis auszulösen. Beachten Sie, dass Sie die Aufforderung akzeptieren müssen, um Standortberechtigungen für die App zu aktivieren.
  6. Verwenden Sie Visual Studio, um die Hintergrundaufgabe für den Speicherort auszulösen. Weitere Informationen zum Auslösen von Hintergrundaufgaben in Visual Studio finden Sie unter "Auslösen von Hintergrundaufgaben".

Behandeln von Problemen mit Ihrer App

Bevor Ihre App auf den Standort zugreifen kann, muss der Standort auf dem Gerät aktiviert sein. Überprüfen Sie in der Einstellungs-App , ob die folgenden Datenschutzeinstellungen für den Speicherort aktiviert sind:

  • Speicherort für dieses Gerät... ist aktiviert (nicht anwendbar in Windows 10 Mobile)
  • Die Einstellung "Standortdienste" ist aktiviert.
  • Unter " Apps auswählen", die Ihren Standort verwenden können, ist Ihre App auf "Ein" festgelegt.