Mobile

Membangun Geofencing di Aplikasi Driver Container: Pengalaman dan Tantangannya di Expo React Native

admin
admin

1 Sep 2026 • 7 min baca

Membangun Geofencing di Aplikasi Driver Container: Pengalaman dan Tantangannya di Expo React Native

Beberapa waktu lalu saya mengerjakan fitur yang kelihatannya sederhana di atas kertas: aplikasi driver container yang bisa mengetahui posisi truk secara otomatis, lalu memperbarui status tugas ketika truk memasuki area tertentu. Teknologi yang digunakan adalah geofencing.

Konsepnya sederhana, tetapi implementasinya membutuhkan waktu berminggu-minggu. Di artikel ini saya ingin berbagi pengalaman, mulai dari mengenal geofencing, manfaatnya, penerapannya di Expo React Native, berbagai tantangan yang saya hadapi, hingga akhirnya fitur ini berhasil berjalan di production.

Geofence Itu Apa Sih?

Bayangin kamu menggambar sebuah lingkaran di peta. Misalnya, lingkaran dengan radius 100 meter yang berpusat di sebuah depo. Itulah geofence, yaitu pagar virtual di dunia nyata.

Ketika sebuah perangkat masuk atau keluar dari area tersebut, sistem bisa menjalankan aksi tertentu. Masuk area akan memicu event ENTER, sedangkan keluar area akan memicu event EXIT. Sesederhana itu.

Yang sering salah dipahami, geofence bukan berarti aplikasi menyalakan GPS terus-menerus lalu menghitung jarak setiap detik. Kalau begitu, baterai HP bisa cepat habis.

Cara kerjanya justru berbeda. Kita cukup mendaftarkan koordinat dan radius geofence ke sistem operasi, kemudian sistem operasi yang memantau pergerakan perangkat menggunakan kombinasi GPS, Wi-Fi, dan jaringan seluler. Aplikasi tidak perlu terus aktif.

Ketika perangkat benar-benar melewati batas geofence, sistem operasi akan membangunkan aplikasi dan mengirimkan event bahwa perangkat sudah masuk atau keluar dari area tersebut.

Cara ini jauh lebih hemat baterai. Tapi di balik konsep yang terlihat sederhana ini, ada beberapa jebakan teknis yang ternyata cukup menarik dan akan saya bahas di bagian berikutnya.

Geofence Itu Berguna untuk Apa?

Sebelum membahas studi kasus, berikut beberapa penerapan geofence dalam kehidupan sehari-hari:

Absensi berbasis lokasi: Sistem dapat mencatat kehadiran ketika karyawan berada di area kantor.

Marketing dan promo: Aplikasi dapat mengirimkan notifikasi promo ketika pengguna berada di dekat lokasi tertentu, seperti pusat perbelanjaan.

Logistik dan armada: Geofence dapat digunakan untuk mengetahui kapan kendaraan tiba di gudang, keluar dari area tertentu, atau memasuki zona terlarang tanpa pengecekan manual.

Keamanan dan pemantauan: Sistem dapat mengirimkan peringatan ketika seseorang atau barang keluar dari area yang telah ditentukan.

Intinya, geofencing mengubah lokasi menjadi pemicu aksi otomatis, sehingga proses yang sebelumnya membutuhkan input manual dapat dilakukan secara otomatis berdasarkan posisi pengguna atau kendaraan.

Studi Kasus Saya: Aplikasi Driver Container

Aplikasi yang saya kerjakan digunakan oleh driver truk container. Alurnya terdiri dari beberapa tahap: mengambil container kosong di depo, membawa container ke gudang untuk stuffing, lalu mengantarkannya ke container yard (CY) di pelabuhan.

Setiap tahap memiliki status: Job Baru → Proses Ambil Empty Container → Proses Stuffing → Container Masuk ke CY.

Sebelumnya, status diperbarui secara manual oleh driver. Karena driver sedang berkendara dan sering tidak sempat membuka aplikasi, banyak status yang terlambat atau terlewat.

Kebetulan sistem sudah memiliki data master lokasi yang berisi nama lokasi, koordinat, dan status tahapnya. Data tersebut kemudian saya gunakan sebagai dasar geofencing dengan radius 100 meter.

Alurnya sederhana: ketika truk memasuki area depo, sistem memeriksa tugas driver dengan status Job Baru dan otomatis mengubahnya menjadi Proses Ambil Empty Container. Ketika masuk area gudang stuffing, status berubah menjadi Proses Stuffing. Terakhir, ketika masuk area CY, status berubah menjadi Container Masuk ke CY.

Dengan begitu, satu tugas container dapat berjalan dari awal hingga selesai hanya berdasarkan pergerakan truk, tanpa driver perlu memperbarui status secara manual.

Cara biasanya orang bikin geofence di Expo

Aplikasi ini dibangun pakai Expo. Dan kalau kamu cari tutorial geofence di Expo atau React Native, hampir semua yang ketemu polanya sama: pakai expo-location plus expo-task-manager. Kurang lebih kayak gini:

import * as TaskManager from "expo-task-manager";
import * as Location from "expo-location";

const GEOFENCE_TASK = "GEOFENCE_TASK";

TaskManager.defineTask(GEOFENCE_TASK, ({ data, error }) => {
  if (error) return;
  const { eventType, region } = data as any;
  if (eventType === Location.GeofencingEventType.Enter) {
    console.log("Masuk area:", region);
  }
});

await Location.startGeofencingAsync(GEOFENCE_TASK, [
  { identifier: "gudang-stuffing", latitude: -6.2, longitude: 106.8, radius: 200 },
]);

Kode ini beneran jalan, dan buat demo atau kebutuhan ringan itu cukup. Tapi begitu saya bawa ke skenario production, batasnya kelihatan satu per satu. Dan batas-batas itulah yang jadi tantangan utama proyek ini.

Tantangan Implementasi di Expo dan Android

Tantangan pertama adalah menangani event ketika aplikasi sudah tidak aktif. Android dapat menghentikan aplikasi untuk menghemat baterai, sehingga event geofence yang diterima dari sisi native tidak selalu dapat langsung diproses oleh JavaScript di Expo.

Tantangan kedua adalah proses native tidak memiliki konteks pengguna, seperti token login dan identitas driver. Padahal, informasi tersebut diperlukan untuk memeriksa tugas dan memperbarui status ke server.

Tantangan ketiga adalah kualitas data lokasi. Koordinat kosong, tidak valid, atau duplikat dapat menyebabkan proses pendaftaran geofence gagal tanpa menampilkan error yang jelas.

Tantangan keempat adalah akurasi GPS yang tidak stabil, terutama di area padat. Hal ini dapat menyebabkan event masuk dan keluar geofence tercatat berulang kali.

Tantangan terakhir adalah perbedaan pengaturan penghemat baterai pada setiap merek ponsel. Fitur dapat berjalan normal pada satu perangkat, tetapi tidak berfungsi dengan baik pada perangkat lain yang digunakan driver di lapangan.

Bagaimana saya menyelesaikannya

Diagram alur update status tugas driver otomatis via geofence dari Job Baru sampai Container Masuk ke CY
Alur lengkapnya: dari data master lokasi, truk yang masuk radius 100 meter, sampai status tugas maju sendiri dan berhenti di CY.

Dari berbagai tantangan tersebut, saya menyimpulkan bahwa logika utama tidak boleh sepenuhnya bergantung pada JavaScript. Proses penting harus berjalan di sisi native agar tetap dapat bekerja meskipun aplikasi tidak aktif.

Saya menggunakan custom native module Expo dengan Kotlin dan membaginya menjadi tiga bagian.

Pertama, JavaScript bertugas mengambil data lokasi dari server, mendaftarkan geofence dengan radius 100 meter, serta menyimpan token dan identitas driver ke sisi native.

Kedua, native module menggunakan GeofencingClient untuk mendaftarkan area ke sistem Android. Dengan demikian, geofence tetap terdaftar meskipun aplikasi ditutup.

val geofence = Geofence.Builder()
  .setRequestId(id)
  .setCircularRegion(lat, lng, radius) // radius 100m dari data master
  .setTransitionTypes(
    Geofence.GEOFENCE_TRANSITION_ENTER or
    Geofence.GEOFENCE_TRANSITION_EXIT
  )
  .setExpirationDuration(Geofence.NEVER_EXPIRE)
  .build()

Ketiga, receiver bertugas menangani event ketika kendaraan memasuki area. Receiver mengambil konfigurasi yang telah disimpan, memeriksa tugas aktif driver, lalu memperbarui status berdasarkan urutan yang sesuai.

Validasi urutan status menjadi bagian penting. Sebuah lokasi hanya dapat memperbarui tugas yang berada pada tahap sebelumnya. Dengan begitu, event GPS yang tidak akurat atau terjadi berulang kali tidak langsung menyebabkan perubahan status.

// peta urutan: lokasi ini boleh memajukan status apa
val statusSequence = mapOf(
  "proses ambil empty container" to "Job Baru",
  "proses stuffing" to "PROSES AMBIL EMPTY CONTAINER",
  "container masuk ke cy" to "PROSES STUFFING"
)

// saat masuk area: cari tugas yang statusnya
// satu tahap sebelum lokasi ini
val requiredPreviousStatus = statusSequence[areaStatus]
val matchingJobs = activeJobs.filter {
  it.lastStatus == requiredPreviousStatus
}

Untuk mengatasi data lokasi yang tidak valid, saya menerapkan filter di JavaScript dan Kotlin. Koordinat kosong, bernilai nol, atau berada di luar batas valid akan diabaikan.

if (lat.isNaN() || lng.isNaN() || lat < -90.0 || lat > 90.0 ||
    lng < -180.0 || lng > 180.0 || radius <= 0f) {
  return@mapNotNull null // skip data jelek
}

Selain itu, saya menggunakan foreground service dan meminta pengguna mengecualikan aplikasi dari pengoptimalan baterai agar proses tetap berjalan di latar belakang.

Dengan arsitektur ini, aplikasi cukup dibuka minimal satu kali untuk mendaftarkan geofence dan menyimpan konfigurasi. Setelah itu, proses tetap dapat berjalan meskipun aplikasi ditutup. Jika perangkat dihidupkan ulang, pengguna cukup membuka aplikasi kembali agar seluruh geofence didaftarkan ulang.

Bagaimana Pengujiannya?

Pengujian dilakukan menggunakan mock location. Dengan mengaktifkan Developer Mode Android dan menggunakan aplikasi lokasi palsu, perjalanan dapat disimulasikan tanpa harus keluar rumah.

Beberapa skenario yang diuji antara lain melewati geofence, kembali melewatinya, berhenti di dalam area, dan bergerak di sekitar batas radius. Hasilnya dapat dilihat melalui log, seperti event yang tercatat, waktu respons, dan notifikasi yang muncul.

Namun, pengujian terkait penghemat baterai setiap merek ponsel dan akurasi GPS tetap perlu dilakukan langsung di lapangan.

Pelajaran yang Saya Dapatkan

Fitur akhirnya berjalan sesuai harapan. Ketika truk memasuki area yang tepat, status tugas diperbarui secara otomatis, driver menerima notifikasi, dan tim operasional tidak perlu melakukan pengecekan secara manual.

Pelajaran terbesarnya adalah fitur yang andal bukan hanya tentang kode, tetapi juga memahami kondisi ketika aplikasi dapat berhenti berjalan. Karena itu, pemahaman terhadap siklus hidup platform menjadi hal yang lebih penting sebelum memilih library atau teknologi.

Artikel Terkait

(3)

Komentar

(0)

Komentar Anda akan dimoderasi.

Memuat komentar...