35 lines
1.5 KiB
Markdown
35 lines
1.5 KiB
Markdown
# iOS Location Flow (Dumon Client)
|
|
|
|
Tujuan: memastikan `getLatestPosition()` tidak mengembalikan default (lat/lon 0, accuracy 999) di iOS.
|
|
|
|
## Aturan utama
|
|
|
|
- `getLatestPosition()` hanya mengembalikan snapshot terakhir dari `didUpdateLocations`.
|
|
- Jika belum ada update lokasi, hasilnya akan default.
|
|
- Jadi, `startPositioning()` wajib dipanggil dan update pertama harus diterima sebelum `getLatestPosition()` dipakai sebagai sumber data utama.
|
|
|
|
## Urutan yang benar
|
|
|
|
1. `checkAndRequestPermissions()` dipanggil saat aplikasi siap meminta lokasi.
|
|
2. Jika `location: granted`, lanjut; jika `denied`, hentikan flow dan minta user aktifkan izin.
|
|
3. Panggil `startPositioning()` sekali.
|
|
4. Tunggu event `onPositionUpdate` pertama.
|
|
5. Gunakan data dari event pertama sebagai sumber posisi awal.
|
|
6. `getLatestPosition()` baru dipakai setelah event pertama (sebagai snapshot tambahan/fallback).
|
|
|
|
## Contoh urutan (pseudo)
|
|
|
|
```ts
|
|
await checkPermission(); // harus granted
|
|
await continuousWatchPosition(); // startPositioning
|
|
await waitForFirstOnPositionUpdate(); // resolve saat listener pertama
|
|
const pos = await getGeoloc(); // sekarang safe
|
|
```
|
|
|
|
## Checklist debugging
|
|
|
|
- Pastikan `initiateLocationState()` dipanggil sebelum flow yang butuh posisi.
|
|
- Pastikan `checkPermission()` sukses sebelum `continuousWatchPosition()`.
|
|
- Pastikan ada log yang membuktikan `onPositionUpdate` terpanggil.
|
|
- Jangan panggil `getLatestPosition()` terlalu awal (sebelum update pertama).
|