Menyiapkan geofence (batas wilayah geografis virtual)

Geofence mendefinisikan batas geografis melingkar di sekitar titik menarik. Aplikasi Anda menerima pemberitahuan saat pengguna memasuki atau keluar dari batas. Geofence berguna untuk pengingat, pemberitahuan, check-in, dan pengiriman konten kontekstual berbasis lokasi.

Artikel ini menunjukkan cara membuat geofence, memantau perubahan status, dan menangani peristiwa geofence di aplikasi SDK Aplikasi Windows (WinUI 3).

Prerequisites

  • Proyek WinUI 3 yang dibuat dari templat Blank App, Packaged (WinUI 3 pada Desktop).
  • Kemampuan Lokasi dideklarasikan dalam manifes paket. Lihat Mendapatkan lokasi pengguna untuk mendapatkan petunjuk.

Meminta akses lokasi

Panggil Geolocator.RequestAccessAsync sebelum membuat atau memantau geofence.

using Windows.Devices.Geolocation;
using Windows.Devices.Geolocation.Geofencing;

var accessStatus = await Geolocator.RequestAccessAsync();
if (accessStatus != GeolocationAccessStatus.Allowed)
{
    StatusText.Text = "Location access is required for geofencing.";
    return;
}

Membuat geofence

Tentukan geofence dengan menentukan pengidentifikasi, pusat geografis, radius dalam meter, dan transisi status mana yang akan dipantau (dimasukkan, keluar, atau dihapus).

var position = new BasicGeoposition
{
    Latitude = 47.6062,
    Longitude = -122.3321
};

var geocircle = new Geocircle(position, 200); // 200-meter radius

var geofence = new Geofence(
    "SeattleDowntown",                          // Unique identifier
    geocircle,                                  // Geographic boundary
    MonitoredGeofenceStates.Entered |           // States to monitor
    MonitoredGeofenceStates.Exited,
    false,                                      // Single use: false = persistent
    TimeSpan.FromSeconds(10)                    // Dwell time before triggering
);

GeofenceMonitor.Current.Geofences.Add(geofence);

Parameter geofence

Parameter Deskripsi
id String unik yang mengidentifikasi geofence. Gunakan ini untuk membedakan kejadian yang berasal dari geofence yang berbeda.
geoshape Geocircle yang mendefinisikan batas. Hanya batas melingkar yang didukung.
monitoredStates Transisi mana yang akan dipantau: Entered, , Exitedatau Removed. Gabungkan dengan operator |.
singleUse Jika true, geofence akan terpicu satu kali dan dihapus secara otomatis.
dwellTime Berapa lama pengguna harus tetap berada di dalam (atau di luar) batas sebelum peristiwa diaktifkan. Membantu memfilter persimpangan singkat.

Pantau kejadian geofence di latar depan

Berlangganan ke peristiwa GeofenceMonitor.Current.GeofenceStateChanged untuk menerima pemberitahuan saat aplikasi Anda berjalan.

GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;

Baca laporan dan perbarui UI. Peristiwa ini terjadi pada thread latar belakang, jadi gunakan DispatcherQueue untuk mengarahkan pembaruan UI.

private void OnGeofenceStateChanged(GeofenceMonitor sender, object args)
{
    var reports = sender.ReadReports();

    DispatcherQueue.TryEnqueue(() =>
    {
        foreach (var report in reports)
        {
            var state = report.NewState;
            var id = report.Geofence.Id;

            switch (state)
            {
                case GeofenceState.Entered:
                    StatusText.Text = $"Entered geofence: {id}";
                    break;
                case GeofenceState.Exited:
                    StatusText.Text = $"Exited geofence: {id}";
                    break;
                case GeofenceState.Removed:
                    StatusText.Text = $"Geofence removed: {id}";
                    // Re-add the geofence if it was removed due to expiration
                    break;
            }
        }
    });
}

Memantau perubahan status geofence

Gunakan GeofenceMonitor.Current.StatusChanged untuk mendeteksi kapan pemantauan geofence dinonaktifkan — misalnya, saat pengguna menonaktifkan layanan lokasi.

GeofenceMonitor.Current.StatusChanged += (sender, args) =>
{
    DispatcherQueue.TryEnqueue(() =>
    {
        var status = sender.Status;
        if (status == GeofenceMonitorStatus.Disabled)
        {
            StatusText.Text = "Geofence monitoring is disabled. Check location settings.";
        }
    });
};

Tip

Saat menggunakan geofence, pantau perubahan izin melalui GeofenceMonitor.StatusChanged daripada Geolocator.StatusChanged. Nilai GeofenceMonitorStatusDisabled setara dengan PositionStatus , tetapi Disabled menyediakan lebih banyak GeofenceMonitorStatuskonteks untuk skenario geofencing.

Menghapus geofence

Hapus geofence dengan mencarinya di koleksi GeofenceMonitor.Current.Geofences.

var geofences = GeofenceMonitor.Current.Geofences;
var target = geofences.FirstOrDefault(g => g.Id == "SeattleDowntown");

if (target != null)
{
    geofences.Remove(target);
}

Praktik terbaik

  • Atur waktu tinggal yang wajar. Waktu tinggal setidaknya 10 detik membantu memfilter jitter GPS dan mencegah pemicu palsu di tepi batas.
  • Gunakan radius setidaknya 50 meter. Akurasi GPS bervariasi menurut perangkat dan lingkungan. Radius yang lebih kecil dari 50 meter dapat menghasilkan hasil yang tidak dapat diandalkan.
  • Periksa akses internet jika diperlukan. Jika aplikasi Anda melakukan operasi jaringan saat peristiwa geofence terjadi (seperti mengirim pemberitahuan ke server), pastikan konektivitas tersedia sebelum membuat geofence.
  • Tangani status Removed. Geofence dapat dihapus oleh sistem jika kedaluwarsa atau jika sistem berada di bawah tekanan sumber daya. Periksa keberadaan GeofenceState.Removed dan buat ulang geofence jika diperlukan dalam skenario Anda.
  • Jangan memantau mode latar depan dan mode latar belakang secara bersamaan untuk geofence yang sama, kecuali jika memang diperlukan. Jika demikian, batalkan registrasi listener latar depan saat aplikasi ditangguhkan dan daftarkan kembali saat aplikasi aktif kembali.