Sdílet prostřednictvím


Nastavte geografickou zónu

Nastavte v aplikaci geofence a zjistěte, jak zpracovávat oznámení v popředí a na pozadí.

Povolit funkci určování polohy

  1. V Průzkumníku řešenípoklikejte na package.appxmanifest a vyberte kartu Schopnosti.
  2. V seznamu SchopnostízaškrtněteUmístění. Tím se do souboru manifestu balíčku přidá funkce Location zařízení.
  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

Nastavení geografické zóny

Krok 1: Žádost o přístup k umístění uživatele

Důležitý

Před pokusem o přístup k umístění uživatele musíte požádat o přístup k umístění uživatele pomocí metody RequestAccessAsync. Musíte zavolat metodu RequestAccessAsync z uživatelského rozhraní (UI thread) a vaše aplikace musí být v popředí. Vaše aplikace nebude mít přístup k informacím o poloze uživatele, dokud uživatel neudělí oprávnění k vaší aplikaci.

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

Metoda RequestAccessAsync vyzve uživatele k zadání oprávnění pro přístup k jeho umístění. Uživateli se zobrazí výzva pouze jednou (pro každou aplikaci). Po prvním udělení nebo zamítnutí oprávnění už tato metoda nevyzývá uživatele k dalšímu zadání oprávnění. Pokud chcete uživateli pomoct změnit oprávnění k poloze po zobrazení výzvy, doporučujeme zadat odkaz na nastavení umístění, jak je znázorněno dále v tomto tématu.

Krok 2: Registrace změn ve stavu geografické zóny a oprávnění k umístění

V tomto příkladu se příkaz switch používá s accessStatus (z předchozího příkladu), aby fungoval pouze v případě, že je povolený přístup k umístění uživatele. Pokud je povolen přístup k umístění uživatele, kód přistupuje k aktuálním geografickým zónám, změny stavu geografické zóny a změny v oprávněních k umístění jsou registrovány.

Tip Při použití geografické zóny monitorujte změny v oprávněních umístění pomocí události StatusChanged z třídy GeofenceMonitor místo události StatusChanged z třídy Geolocator. GeofenceMonitorStatusDisabled odpovídá zakázanému PositionStatus – obě indikují, že aplikace nemá oprávnění k přístupu k poloze uživatele.

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;
}

Poté, když přejdete z popředí aplikace, zrušte registraci posluchače událostí.

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

    base.OnNavigatingFrom(e);
}

Krok 3: Vytvoření geografické zóny

Teď jste připraveni definovat a nastavit objekt geofence. Můžete si vybrat z několika různých přetížení konstruktoru, v závislosti na vašich potřebách. V nejzásadnějším konstruktoru geografické zóny zadejte pouze id aGeoshape, jak je znázorněno zde.

// 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);

Geofence můžete dále vyladit pomocí jednoho z dalších konstruktorů. V dalším příkladu konstruktor geofence určuje tyto další parametry:

  • Monitorované stavy – označuje, pro jaké události v rámci geozóny chcete dostávat oznámení: vstup do definované oblasti, opuštění definované oblasti nebo odebrání geozóny.
  • SingleUse – odebere geofence, jakmile byly splněny všechny stavy, pro které je geofence monitorován.
  • Doba Pobyvání – udává, jak dlouho musí být uživatel v definované oblasti nebo mimo ni, než dojde k aktivaci vstupních a výstupních událostí.
  • StartTime – určuje, kdy začít monitorovat geofencing.
  • Doba trvání – označuje období, pro které se má geofence monitorovat.
// 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);

Po vytvoření nezapomeňte do monitoru zaregistrovat nový Geofence.

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

Krok 4: Zpracování změn v oprávněních k umístění

Objekt GeofenceMonitor aktivuje událost StatusChanged, která označuje, že se změnilo nastavení polohy uživatele. Tato událost předá odpovídající stav prostřednictvím vlastnosti Status odesílatele argumentu (typu GeofenceMonitorStatus). Všimněte si, že tato metoda není volána z vlákna uživatelského rozhraní a Dispatcher objekt vyvolá změny uživatelského rozhraní.

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;
    }
   });
}

Nastavení oznámení na popředí

Po vytvoření geofence musíte přidat logiku pro zpracování toho, co se stane, když dojde k události geografické zóny. V závislosti na monitorovaných stavech , které jste nastavili, můžete obdržet událost v následujících případech:

  • Uživatel zadá oblast zájmu.
  • Uživatel opustí oblast zájmu.
  • Platnost geofencingu vypršela nebo byl odebrán. Upozorňujeme, že aplikace na pozadí není aktivována pro událost odebrání.

Události můžete naslouchat přímo z aplikace, když je spuštěná, nebo zaregistrovat úlohu na pozadí, abyste dostali oznámení na pozadí, když dojde k události.

Krok 1: Registrace událostí změny stavu geografické zóny

Aby vaše aplikace dostala oznámení o změně stavu geografické zóny na popředí, musíte zaregistrovat obslužnou rutinu události. Obvykle se nastavuje při vytváření geografické zóny.

private void Initialize()
{
    // Other initialization logic

    GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
}

Krok 2: Implementace obslužné rutiny události geofence

Dalším krokem je implementace obslužných rutin událostí. Akce provedená zde závisí na tom, k čemu vaše aplikace používá geografické ohraničení.

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.

            }
        }
    });
}

Nastavení oznámení na pozadí

Po vytvoření geofencí musíte přidat logiku, která se postará o to, co se stane, když dojde k události geografické zóny. V závislosti na monitorovaných stavech, které jste nastavili, může dojít k události v následujících případech:

  • Uživatel zadá oblast zájmu.
  • Uživatel opustí oblast zájmu.
  • Platnost geografické zóny vypršela nebo byla odebrána. Upozorňujeme, že aplikace na pozadí není aktivována pro událost odebrání.

Sledování události geografické zóny na pozadí

  • Deklarujte úlohu na pozadí v manifestu aplikace.
  • Zaregistrujte úlohu na pozadí v aplikaci. Pokud vaše aplikace potřebuje přístup k internetu, například pro přístup ke cloudové službě, můžete nastavit příznak, když je událost spuštěna. Můžete také nastavit příznak, abyste měli jistotu, že se uživatel nachází při aktivaci události, abyste měli jistotu, že se uživateli zobrazí oznámení.
  • Když je vaše aplikace spuštěná v popředí, vyzve uživatele, aby udělil oprávnění k umístění aplikace.

Krok 1: Registrace změn stavu geografické zóny

V manifestu aplikace na kartě Deklarace přidejte deklaraci pro úlohu na pozadí týkající se polohy. Postup:

  • Přidejte deklaraci typu Úlohy na pozadí.
  • Nastavte typ úlohy vlastnosti Lokace.
  • Nastavte vstupní bod do aplikace tak, aby volal při aktivaci události.

Krok 2: Registrace úlohy na pozadí

Kód v tomto kroku registruje úlohu na pozadí pro geofencing. Připomeňme si, že při vytvoření geografické zóny jsme zkontrolovali oprávnění k poloze.

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;

    }
}


Krok 3: Zpracování oznámení na pozadí

Akce, kterou podniknete pro informování uživatele, závisí na tom, co vaše aplikace dělá, ale můžete zobrazit oznámení toast, přehrát zvuk nebo aktualizovat živou dlaždici. Kód v tomto kroku zpracovává oznámení.

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);
            }
        });
    }
}


Změna nastavení ochrany osobních údajů

Pokud nastavení ochrany osobních údajů pro polohu neumožňují vaší aplikaci přístup k poloze uživatele, doporučujeme poskytnout pohodlný odkaz na nastavení ochrany osobních údajů pro lokalizaci v aplikaci Nastavení. V tomto příkladu se používá ovládací prvek Hypertextový odkaz k navigaci na identifikátor URI ms-settings:privacy-location.

<!--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>

Případně může vaše aplikace volat metodu LaunchUriAsync ke spuštění aplikace Nastavení z kódu. Další informace najdete v tématu Spuštění aplikace Nastavení systému Windows.

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

Testování a ladění aplikace

Testování a ladění geofencingových aplikací může být náročné, protože závisí na umístění zařízení. Zde uvádíme několik metod pro testování geofencí v popředí a na pozadí.

Ladění aplikace geofencing

  1. Fyzicky přesuňte zařízení do nových umístění.
  2. Otestujte vstup do geofencingu vytvořením oblasti geofencingu, která zahrnuje aktuální fyzickou polohu, abyste byli již uvnitř geofencingu a událost vstupu do geofencingu byla okamžitě oznámena.
  3. K simulaci umístění pro zařízení použijte emulátor sady Microsoft Visual Studio.

Testování a ladění aplikace geozónování spuštěné v popředí

K otestování vaší aplikace geofencingu, která je spuštěná v popředí

  1. Sestavte aplikaci v Visual Studio.
  2. Spusťte aplikaci v emulátoru sady Visual Studio.
  3. Pomocí těchto nástrojů můžete simulovat různá umístění uvnitř a mimo vaši geografickou oblast. Ujistěte se, že počkáte dost dlouho po čase zadaném vlastností Doba prodlevy, aby se událost spustila. Upozorňujeme, že musíte přijmout výzvu k povolení oprávnění k poloze pro aplikaci. Další informace o simulaci umístění najdete v tématu Nastavení simulované geografické polohy zařízení.
  4. Emulátor můžete také použít k odhadu velikosti plotů a doby trvání přibližně potřebné k detekci v různých rychlostech.

Testování a ladění geolokační aplikace spuštěné na pozadí

Otestování aplikace pro geofencing, která běží na pozadí

  1. Sestavte aplikaci v sadě Visual Studio. Aplikace by měla nastavit typ úlohy Umístění pozadí.
  2. Nejprve nasaďte aplikaci místně.
  3. Zavřete aplikaci, která je spuštěná místně.
  4. Spusťte aplikaci v emulátoru sady Visual Studio. V emulátoru je simulace geofencingu na pozadí podporována pouze na jedné aplikaci současně. V rámci emulátoru nepoužívejte více aplikací pro geofencing.
  5. Z emulátoru simulujte různá umístění uvnitř a mimo vaši geografickou oblast. Ujistěte se, že počkáte dostatečně dlouho po době setrvání, aby se událost aktivovala. Upozorňujeme, že musíte přijmout výzvu k povolení oprávnění k poloze pro aplikaci.
  6. Pomocí sady Visual Studio aktivujte úkol na pozadí umístění. Další informace o aktivaci úloh na pozadí v sadě Visual Studio najdete v tématu Jak aktivovat úlohy na pozadí.

Řešení potíží s aplikací

Než bude mít vaše aplikace přístup k poloze, musí být na zařízení povolená Lokalizace. V aplikaci Nastavení zkontrolujte, jestli jsou zapnutá následující nastavení ochrany osobních údajů umístění :

  • Umístění pro toto zařízení... je zapnuto (nejde použít ve Windows 10 Mobile)
  • Nastavení služby polohy, Umístění, je zapnuto
  • V části Vyberte aplikace, které mohou používat vaši polohu, je vaše aplikace nastavená na na