Menyiapkan geofence

Catatan

Layanan MapControl dan peta mengadkan kunci autentikasi peta yang disebut MapServiceToken. Untuk info selengkapnya tentang mendapatkan dan mengatur kunci autentikasi peta, lihat Meminta kunci autentikasi peta.

Siapkan Geofence di aplikasi Anda, dan pelajari cara menangani pemberitahuan di latar depan dan latar belakang.

Ujung Untuk mempelajari lebih lanjut tentang mengakses lokasi di aplikasi Anda, unduh sampel berikut dari repo Windows-universal-samples di GitHub.

Mengaktifkan kemampuan lokasi

  1. Di Penjelajah Solusi, klik dua kali pada package.appxmanifest dan pilih tab Kemampuan.
  2. Dalam daftar Kemampuan , periksa Lokasi. Ini menambahkan Location kemampuan perangkat ke file manifes paket.
  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

Menyiapkan geofence

Langkah 1: Meminta akses ke lokasi pengguna

Penting Anda harus meminta akses ke lokasi pengguna dengan menggunakan metode RequestAccessAsync sebelum mencoba mengakses lokasi pengguna. Anda harus memanggil metode RequestAccessAsync dari utas UI dan aplikasi Anda harus berada di latar depan. Aplikasi Anda tidak akan dapat mengakses informasi lokasi pengguna sampai setelah pengguna memberikan izin ke aplikasi Anda.

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

Metode RequestAccessAsync meminta izin pengguna untuk mengakses lokasi mereka. Pengguna hanya diminta sekali (per aplikasi). Setelah pertama kali mereka memberikan atau menolak izin, metode ini tidak lagi meminta izin pengguna. Untuk membantu pengguna mengubah izin lokasi setelah diminta, sebaiknya Anda memberikan tautan ke pengaturan lokasi seperti yang ditunjukkan nanti dalam topik ini.

Langkah 2: Daftar untuk perubahan status geofence dan izin lokasi

Dalam contoh ini, pernyataan sakelar digunakan dengan accessStatus (dari contoh sebelumnya) untuk bertindak hanya ketika akses ke lokasi pengguna diizinkan. Jika akses ke lokasi pengguna diizinkan, kode mengakses geofences saat ini, mendaftar untuk perubahan status geofence, dan mendaftar untuk perubahan izin lokasi.

Ujung Saat menggunakan geofence, pantau perubahan izin lokasi menggunakan peristiwa StatusChanged dari kelas GeofenceMonitor, bukan peristiwa StatusChanged dari kelas Geolocator. GeofenceMonitorStatus of Disabled setara dengan PositionStatus yang dinonaktifkan - keduanya menunjukkan bahwa aplikasi tidak memiliki izin untuk mengakses lokasi pengguna.

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

Kemudian, saat menavigasi jauh dari aplikasi latar depan Anda, tidak terdaftarkan pendengar acara.

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

    base.OnNavigatingFrom(e);
}

Langkah 3: Buat geofence

Sekarang, Anda siap untuk menentukan dan mengatur objek Geofence . Ada beberapa kelebihan konstruktor yang berbeda untuk dipilih, tergantung pada kebutuhan Anda. Dalam konstruktor geofence yang paling dasar, tentukan hanya Id dan Geoshape seperti yang ditunjukkan di sini.

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

Anda dapat menyempurnakan geofence Anda lebih jauh dengan menggunakan salah satu konstruktor lainnya. Dalam contoh berikutnya, konstruktor geofence menentukan parameter tambahan ini:

  • MonitoredStates - Menunjukkan peristiwa geofence apa yang ingin Anda terima pemberitahuan untuk memasuki wilayah yang ditentukan, meninggalkan wilayah yang ditentukan, atau penghapusan geofence.
  • SingleUse - Menghapus geofence setelah semua negara geofence sedang dipantau telah terpenuhi.
  • DwellTime - Menunjukkan berapa lama pengguna harus masuk atau keluar dari area yang ditentukan sebelum peristiwa masuk /keluar dipicu.
  • StartTime - Menunjukkan kapan harus mulai memantau geofence.
  • Durasi - Menunjukkan periode untuk memantau geofence.
// 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);

Setelah membuat, ingatlah untuk mendaftarkan Geofence baru Anda ke monitor.

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

Langkah 4: Menangani perubahan izin lokasi

Objek GeofenceMonitor memicu peristiwa StatusChanged untuk menunjukkan bahwa pengaturan lokasi pengguna berubah. Peristiwa itu melewati status yang sesuai melalui pengirim argumen. Properti status (jenis GeofenceMonitorStatus). Perhatikan bahwa metode ini tidak dipanggil dari utas UI dan objek Dispatcher memanggil perubahan UI.

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

Menyiapkan notifikasi latar depan

Setelah geofence Anda dibuat, Anda harus menambahkan logika untuk menangani apa yang terjadi ketika peristiwa geofence terjadi. Bergantung pada MonitoredStates yang telah Anda siapkan, Anda mungkin menerima acara saat:

  • Pengguna memasuki wilayah yang menarik.
  • Pengguna meninggalkan wilayah yang menarik.
  • Geofence telah kedaluwarsa atau telah dihapus. Perhatikan bahwa aplikasi latar belakang tidak diaktifkan untuk acara penghapusan.

Anda dapat mendengarkan acara langsung dari aplikasi saat menjalankan atau mendaftar untuk tugas latar belakang sehingga Anda menerima pemberitahuan latar belakang saat peristiwa terjadi.

Langkah 1: Daftar untuk peristiwa perubahan status geofence

Agar aplikasi Anda menerima pemberitahuan latar depan tentang perubahan status geofence, Anda harus mendaftarkan penangan peristiwa. Ini biasanya diatur saat Anda membuat geofence.

private void Initialize()
{
    // Other initialization logic

    GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
}

Langkah 2: Menerapkan penangan peristiwa geofence

Langkah selanjutnya adalah menerapkan penangan acara. Tindakan yang diambil di sini tergantung pada untuk apa aplikasi Anda menggunakan geofence.

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.

            }
        }
    });
}



Menyiapkan notifikasi latar belakang

Setelah geofence Anda dibuat, Anda harus menambahkan logika untuk menangani apa yang terjadi ketika peristiwa geofence terjadi. Bergantung pada MonitoredStates yang telah Anda siapkan, Anda mungkin menerima acara saat:

  • Pengguna memasuki wilayah yang menarik.
  • Pengguna meninggalkan wilayah yang menarik.
  • Geofence telah kedaluwarsa atau telah dihapus. Perhatikan bahwa aplikasi latar belakang tidak diaktifkan untuk acara penghapusan.

Untuk mendengarkan acara geofence di latar belakang

  • Deklarasikan tugas latar belakang dalam manifes aplikasi Anda.
  • Daftarkan tugas latar belakang di aplikasi Anda. Jika aplikasi Anda memerlukan akses internet, katakanlah untuk mengakses layanan cloud, Anda dapat menetapkan bendera untuk itu saat acara dipicu. Anda juga dapat mengatur bendera untuk memastikan bahwa pengguna hadir saat acara dipicu sehingga Anda yakin bahwa pengguna akan diberi tahu.
  • Saat aplikasi Anda berjalan di latar depan, minta pengguna untuk memberikan izin lokasi aplikasi Anda.

Langkah 1: Daftar untuk peristiwa perubahan status geofence

Di manifes aplikasi Anda, di bawah tab Deklarasi , tambahkan deklarasi untuk tugas latar belakang lokasi. Untuk melakukan ini:

  • Tambahkan deklarasi jenis Tugas Latar Belakang.
  • Tetapkan jenis tugas properti Lokasi.
  • Tetapkan titik masuk ke aplikasi Anda untuk dipanggil saat acara dipicu.

Langkah 2: Daftarkan tugas latar belakang

Kode pada langkah ini mendaftarkan tugas latar belakang geofencing. Ingatlah bahwa ketika geofence dibuat, kami memeriksa izin lokasi.

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;

    }
}


Langkah 3: Menangani pemberitahuan latar belakang

Tindakan yang Anda ambil untuk memberi tahu pengguna bergantung pada apa yang dilakukan aplikasi Anda, tetapi Anda dapat menampilkan pemberitahuan bersulang, memutar suara audio, atau memperbarui ubin langsung. Kode pada langkah ini menangani pemberitahuan.

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


Mengubah pengaturan privasi

Jika pengaturan privasi lokasi tidak mengizinkan aplikasi Anda mengakses lokasi pengguna, kami sarankan Anda memberikan tautan yang nyaman ke pengaturan privasi lokasi di aplikasi Pengaturan. Dalam contoh ini, kontrol Hyperlink digunakan menavigasi ke ms-settings:privacy-location URI.

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

Atau, aplikasi Anda dapat memanggil metode LaunchUriAsync untuk meluncurkan aplikasi Pengaturan dari kode. Untuk info selengkapnya, lihat Meluncurkan aplikasi Windows Pengaturan.

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

Menguji dan men-debug aplikasi Anda

Pengujian dan debugging aplikasi geofencing dapat menjadi tantangan karena mereka bergantung pada lokasi perangkat. Di sini, kami menguraikan beberapa metode untuk menguji geofence latar depan dan latar belakang.

Untuk men-debug aplikasi geofencing

  1. Pindahkan perangkat secara fisik ke lokasi baru.
  2. Uji memasuki geofence dengan membuat wilayah geofence yang mencakup lokasi fisik Anda saat ini, sehingga Anda sudah berada di dalam geofence dan peristiwa "geofence enter" segera dipicu.
  3. Gunakan emulator Microsoft Visual Studio untuk mensimulasikan lokasi untuk perangkat.

Menguji dan men-debug aplikasi geofencing yang berjalan di latar depan

Untuk menguji aplikasi geofencing Anda yang menjalankan latar depan

  1. Bangun aplikasi Anda di Visual Studio.
  2. Luncurkan aplikasi Anda di emulator Visual Studio.
  3. Gunakan alat ini untuk mensimulasikan berbagai lokasi di dalam dan di luar wilayah geofence Anda. Pastikan untuk menunggu cukup lama melewati waktu yang ditentukan oleh properti DwellTime untuk memicu acara. Perhatikan bahwa Anda harus menerima perintah untuk mengaktifkan izin lokasi untuk aplikasi. Untuk info selengkapnya tentang simulasi lokasi, lihat Mengatur simulasi geolokasi perangkat.
  4. Anda juga dapat menggunakan emulator untuk memperkirakan ukuran pagar dan waktu tinggal kira-kira perlu dideteksi pada kecepatan yang berbeda.

Menguji dan men-debug aplikasi geofencing yang berjalan di latar belakang

Untuk menguji aplikasi geofencing Anda yang menjalankan latar belakang

  1. Bangun aplikasi Anda di Visual Studio. Perhatikan bahwa aplikasi Anda harus mengatur jenis tugas latar belakang lokasi .
  2. Sebarkan aplikasi secara lokal terlebih dahulu.
  3. Tutup aplikasi Anda yang berjalan secara lokal.
  4. Luncurkan aplikasi Anda di emulator Visual Studio. Perhatikan bahwa simulasi geofencing latar belakang hanya didukung pada satu aplikasi pada satu waktu di dalam emulator. Jangan meluncurkan beberapa aplikasi geofencing di dalam emulator.
  5. Dari emulator, simulasikan berbagai lokasi di dalam dan di luar wilayah geofence Anda. Pastikan untuk menunggu cukup lama melewati DwellTime untuk memicu acara. Perhatikan bahwa Anda harus menerima perintah untuk mengaktifkan izin lokasi untuk aplikasi.
  6. Gunakan Visual Studio untuk memicu tugas latar belakang lokasi. Untuk info selengkapnya tentang memicu tugas latar belakang di Visual Studio, lihat Cara memicu tugas latar belakang.

Memecahkan masalah aplikasi Anda

Sebelum aplikasi Anda dapat mengakses lokasi, Lokasi harus diaktifkan di perangkat. Di aplikasi Pengaturan, periksa apakah pengaturan privasi lokasi berikut diaktifkan:

  • Lokasi untuk perangkat ini...diaktifkan (tidak berlaku di Windows 10 Mobile)
  • Pengaturan layanan lokasi, Lokasi, diaktifkan
  • Di bawah Pilih aplikasi yang dapat menggunakan lokasi Anda, aplikasi Anda akan di-on