Windows Dev Center

Language: HTML | XAML

Einrichten von Geofence-Bereichen (XAML)

[Einige Informationen beziehen sich auf die Vorabversion, die vor der kommerziellen Freigabe grundlegend geändert werden kann. Microsoft übernimmt keine Garantie, weder ausdrücklich noch stillschweigend, für die hier bereitgestellten Informationen.]

Erfahren Sie, wie Sie einen Geofence-Bereich in der App einrichten. In diesem Thema werden zum Veranschaulichen der wichtigsten Punkte Codebeispiele verwendet, von denen manche auf dem Geolocation-Beispiel basieren. Um weitere Informationen zu erhalten, laden Sie das Beispiel herunter, und führen Sie es aus.

Roadmap: Wie hängt dieses Thema mit anderen zusammen? Weitere Informationen:

Schritt 1: Überprüfen, ob Positionsdienste aktiviert sind

Bevor Ihre App auf Positionsdaten zugreifen kann, muss Position auf dem Gerät aktiviert sein. Vergewissern Sie sich in der Einstellungs-App, dass die folgenden Datenschutzeinstellungen für den Standort aktiviert sind:

  • Position für dieses Gerät ... ist aktiviert (gilt nicht für Windows 10 Mobile Insider Preview)
  • Die Einstellung Position der Positionsdienste ist aktiviert.
  • Ihre App hat unter Diese Apps dürfen meinen Standort verwenden die Einstellung Ein.

Schritt 2: Aktivieren der Positionsfunktion

Doppelklicken Sie im Projektmappen-Explorer auf package.appxmanifest, und wählen Sie die Registerkarte Funktionen aus. Aktivieren Sie dann in der Liste Funktionen die Option Position. Dadurch wird der Paketmanifestdatei die Gerätefunktion Location hinzugefügt.


  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

Schritt 3: Anfordern des Zugriffs auf die Position des Benutzers

Fordern Sie den Zugriff auf die Position des Benutzers mit der RequestAccessAsync-Methode an.

Wichtig  Ab Windows 10 Insider Preview rufen Sie vor dem Zugriff auf den Standort des Benutzers die RequestAccessAsync auf. Zu diesem Zeitpunkt muss sich Ihre App im Vordergrund befinden, und RequestAccessAsync muss vom UI-Thread aufgerufen werden. Solange der Benutzer Ihrer App keinen Zugriff auf seine Position gewährt hat, kann Ihre App nicht auf Positionsdaten zugreifen.


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

Die RequestAccessAsync-Methode fordert vom Benutzer die Berechtigung für den Zugriff auf seine Position an. Der Benutzer wird nur einmal (pro App) aufgefordert. Nachdem die Berechtigung erstmalig gewährt oder verweigert wurde, fordert die Methode keine Berechtigung mehr an. Um dem Benutzer das Ändern von Positionsberechtigungen nach der Aufforderung zu erleichtern, empfehlen wir, einen Link zu den Positionseinstellungen bereitzustellen, wie weiter unten in diesem Thema beschrieben.

Schritt 4: Registrieren für Änderungen des Geofence-Zustands und für Positionsberechtigungen

In diesem Beispiel wird eine switch-Anweisung mit accessStatus (aus dem vorherigen Beispiel) verwendet, die nur wirksam ist, wenn der Zugriff auf die Position gewährt wird. Der Code greift (sofern zulässig) auf die aktuellen Geofences zu und führt eine Registrierung für Geofence-Zustandsänderungen und für Positionsberechtigungsänderungen durch.

Tipp  Verwenden Sie bei Verwendung eines Geofence anstelle des StatusChanged-Ereignisses der Geolocator-Klasse das StatusChanged-Ereignis von GeofenceMonitor, um Änderungen an Positionsberechtigungen zu überwachen. Ein GeofenceMonitorStatus-Element mit dem Status Disabled entspricht einem deaktivierten PositionStatus-Element: Beide geben an, dass die App nicht auf Positionsdaten zugreifen darf.

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 die Registrierung der Ereignislistener auf, wenn der Benutzer die Vordergrund-App verlässt.


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

    base.OnNavigatingFrom(e);
}

Schritt 5: Erstellen des Geofence-Bereichs

Nun können Sie ein Geofence-Objekt definieren und einrichten. Abhängig von Ihren Anforderungen stehen mehrere verschiedene Konstruktorüberladungen zur Auswahl. Geben Sie im einfachsten Geofence-Konstruktor wie hier gezeigt nur Id und Geoshape an.



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

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

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

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

Sie können den Geofence mit einem der anderen Konstruktoren weiter optimieren. Im nächsten Beispiel legt der Geofence-Konstruktor diese zusätzliche Parameter fest:

  • MonitoredStates, mit denen angegeben wird, für welche Geofence-Ereignisse Sie Benachrichtigungen erhalten möchten: Betreten der definierten Region, Verlassen der definierten Region oder Entfernung des Geofence-Bereichs
  • SingleUse-Kennzeichen, mit dem der Geofence-Bereich entfernt wird, nachdem alle Zustände, auf die der Geofence-Bereich überwacht wird, erfüllt wurden
  • DwellTime, womit angegeben wird, wie lange sich der Benutzer innerhalb oder außerhalb des definierten Bereichs befinden muss, bevor das enter- oder exit-Ereignis ausgelöst wird
  • StartTime, womit angegeben wird, wann mit der Überwachung des Geofence-Bereichs begonnen wird
  • Duration der Überwachung des Geofence-Bereichs

// Set fence ID
string fenceId = "fence2";

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

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

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

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

// Set how long you need to be in geofence for 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 geofence
Geofence geofence = new Geofence(fenceId, geocircle, monitoredStates, singleUse, dwellTime, startTime, duration);

Schritt 6: Behandeln von Änderungen an Positionsberechtigungen

Das GeofenceMonitor-Objekt löst das StatusChanged-Ereignis aus, um anzugeben, dass sich die Positionseinstellungen des Benutzers geändert haben. Das Ereignis übergibt den entsprechenden Status über die sender.Status-Argumenteigenschaft (vom Typ GeofenceMonitorStatus). Die Methode wird nicht vom UI-Thread aufgerufen, die UI-Änderungen werden durch das Dispatcher-Objekt aufgerufen.



using Windows.UI.Core;
...
public async void OnGeofenceStatusChanged(GeofenceMonitor sender, object e)
{
   await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
   {
    // Show the location setting message only if 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 message to the user to go to 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;
    }
   });
}

Schritt 7: Unterstützen des Benutzers beim Ändern von Positionseinstellungen

Wenn Ihre App gemäß den Positionseinstellungen nicht auf die Position des Benutzers zugreifen darf, wird empfohlen, einen praktischen 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 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 per Code zu starten. Weitere Informationen finden Sie unter So wird's gemacht: Starten der Einstellungs-App.


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

Schritt 8: Behandeln von Änderungen des Geofence-Zustands

Nachdem Ihre Geofence-Bereiche erstellt wurden, müssen Sie die Logik für das Eintreten eines Geofence-Ereignisses hinzufügen.

Weitere Informationen:

  1. Behandeln von Geofence-Benachrichtigungen im Vordergrund
  2. Lauschen auf Geofence-Ereignisse im Hintergrund
  3. Behandeln von Geofence-Benachrichtigungen über eine Hintergrundaufgabe

Verwandte Themen

Geolocation-Beispiel für Windows 10 Insider Preview
Geolocation-Beispiel für Windows 8.1
Roadmap für Apps mit C# und Visual Basic
Roadmap für Apps mit C++
UX-Design für Apps
Richtlinien für Geofencing
Geoshape
Geofence
Geolocator

 

 

Anzeigen:
© 2015 Microsoft