Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 keberadaanGeofenceState.Removeddan 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.
Artikel terkait
Windows developer