Menyiapkan geofence

Catatan

Layanan MapControl dan peta memerlukan kunci autentikasi peta yang disebut MapServiceToken. Untuk informasi 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.

Tips Untuk mempelajari selengkapnya tentang mengakses lokasi di aplikasi Anda, unduh sampel berikut dari repositori Windows-universal-samples di GitHub.

Mengaktifkan kapabilitas lokasi

  1. Di Penjelajah Solusi, klik dua kali package.appxmanifest dan pilih tab Kemampuan .
  2. Di daftar Kapabilitas , centang 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 hingga setelah pengguna memberikan izin ke aplikasi Anda.

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

Metode RequestAccessAsync meminta izin kepada 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 kepada pengguna. Untuk membantu pengguna mengubah izin lokasi setelah diminta, kami sarankan Anda menyediakan 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 pengalih digunakan dengan accessStatus (dari contoh sebelumnya) untuk bertindak hanya ketika akses ke lokasi pengguna diizinkan. Jika akses ke lokasi pengguna diizinkan, kode mengakses geofence saat ini, mendaftar untuk perubahan status geofence, dan mendaftar untuk perubahan izin lokasi.

Tips Saat menggunakan geofence, pantau perubahan izin lokasi menggunakan peristiwa StatusChanged dari kelas GeofenceMonitor alih-alih peristiwa StatusChanged dari kelas Geolocator. GeofenceMonitorStatus dari Dinonaktifkan 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, batalkan pendaftaran pendengar peristiwa.

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

    base.OnNavigatingFrom(e);
}

Langkah 3: Membuat geofence

Sekarang, Anda siap untuk menentukan dan menyiapkan objek Geofence . Ada beberapa kelebihan beban konstruktor yang berbeda untuk dipilih, tergantung pada kebutuhan Anda. Dalam konstruktor geofence 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 lanjut 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 status geofence sedang dipantau telah terpenuhi.
  • DwellTime - Menunjukkan berapa lama pengguna harus masuk atau keluar dari area yang ditentukan sebelum peristiwa enter/exit 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 tersebut melewati status yang sesuai melalui pengirim argumen. Properti status (dari 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 pemberitahuan 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 peristiwa saat:

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

Anda dapat mendengarkan peristiwa langsung dari aplikasi saat berjalan 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 perubahan status geofence, Anda harus mendaftarkan penanganan aktivitas. Ini biasanya disiapkan saat Anda membuat geofence.

private void Initialize()
{
    // Other initialization logic

    GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
}

Langkah 2: Menerapkan penanganan aktivitas geofence

Langkah selanjutnya adalah mengimplementasikan penanganan aktivitas. Tindakan yang diambil di sini tergantung pada 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 pemberitahuan 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 peristiwa saat:

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

Untuk mendengarkan peristiwa geofence di latar belakang

  • Nyatakan tugas latar belakang dalam manifes aplikasi Anda.
  • Daftarkan tugas latar belakang di aplikasi Anda. Jika aplikasi Anda memerlukan akses internet, misalnya untuk mengakses layanan cloud, Anda dapat mengatur bendera untuk itu saat peristiwa dipicu. Anda juga dapat mengatur bendera untuk memastikan bahwa pengguna ada saat peristiwa 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 tipe Tugas Latar Belakang.
  • Atur tipe tugas properti Lokasi.
  • Atur titik masuk ke aplikasi Anda untuk memanggil saat peristiwa dipicu.

Langkah 2: Daftarkan tugas latar belakang

Kode dalam langkah ini mendaftarkan tugas latar belakang geofencing. Ingat 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 tergantung pada apa yang dilakukan aplikasi Anda, tetapi Anda dapat menampilkan pemberitahuan toast, memutar suara audio, atau memperbarui petak peta langsung. Kode dalam 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 informasi selengkapnya, lihat Meluncurkan aplikasi Pengaturan Windows.

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

Menguji dan men-debug aplikasi Anda

Menguji dan men-debug aplikasi geofencing dapat menjadi tantangan karena 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 masuk" segera dipicu.
  3. Gunakan emulator Microsoft Visual Studio untuk mensimulasikan lokasi perangkat.

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

Untuk menguji aplikasi geofencing Anda yang menjalankan latar depan

  1. Buat aplikasi Anda di Visual Studio.
  2. Luncurkan aplikasi Anda di emulator Visual Studio.
  3. Gunakan alat-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 peristiwa. Perhatikan bahwa Anda harus menerima perintah untuk mengaktifkan izin lokasi untuk aplikasi. Untuk informasi selengkapnya tentang mensimulasikan lokasi, lihat Mengatur simulasi geolokasi perangkat.
  4. Anda juga dapat menggunakan emulator untuk memperkirakan ukuran pagar dan waktu tinggal yang 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. Buat 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 dalam emulator. Jangan meluncurkan beberapa aplikasi geofencing 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 peristiwa. Perhatikan bahwa Anda harus menerima perintah untuk mengaktifkan izin lokasi untuk aplikasi.
  6. Gunakan Visual Studio untuk memicu tugas latar belakang lokasi. Untuk informasi 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 diatur ke aktif