Langkah, jarak, kalori, detak jantung, dan tidur harus diambil dari platform pengguna (Android Health Connect di Android, Apple HealthKit di iOS) oleh aplikasi kesehatan dan nutrisi — dan menyajikannya sebagai satu profil harian yang rapi dan terdeduplikasi. Sangat sedikit kesamaan antara kedua API tersebut: mekanisme pembacaan yang terpisah, skema otorisasi yang berbeda, dan struktur data yang berbeda. Kami membangun lapisan sinkronisasi seluler yang membuat keduanya terlihat seperti satu kesatuan.
Tantangan
- Dua API native yang tidak memiliki kesamaan. Apple HealthKit mengembalikan agregat harian melalui callback; Health Connect mengembalikan sampel mentah yang berhalaman dengan metadata sumber yang kaya. Konsep yang sama, bentuk yang sangat berbeda — dan aplikasi harus menormalisasi keduanya menjadi satu skema.
- Penghitungan ganda adalah standar. Telepon, smartwatch, dan aplikasi pihak ketiga dapat melaporkan 8.000 langkah yang sama. Menjumlahkannya secara sederhana akan menggembungkan setiap metrik. Aplikasi perlu mengenali sumber yang tumpang tindih dan menghitung setiap aktivitas dunia nyata sekali saja.
- Baterai dan jaringan tidak bisa mengorbankan kesegaran data. Data kesehatan berubah sepanjang hari, tetapi membaca seluruh riwayat pada setiap sinkronisasi akan menguras baterai dan membebani koneksi seluler. Ritme sinkronisasi harus tetap ringan namun terasa selalu terkini.
Izin bisa membingungkan. Puluhan jenis data, dua model izin, pembatasan pembacaan latar belakang, dan pengguna yang memberikan beberapa cakupan tetapi tidak yang lain — semuanya harus ditangani oleh aplikasi tanpa mengganggu alur.
Solusi Kami
Kami membangun sinkronisasi tiga lapis: lapisan native yang tipis membaca API setiap platform, lapisan normalisasi on-device melakukan deduplikasi dan menggulung data menjadi ringkasan harian, dan backend menyimpannya serta merekonsiliasinya ke dalam satu ledger terpercaya. Klien tidak pernah mengirimkan sampel mentah — ia mengirimkan rollup harian yang bersih dan sesuai zona waktu.

Arsitektur
- iOS membaca Apple HealthKit melalui react-native-health; Android membaca Health Connect melalui react-native-health-connect.
- Normalisasi on-device mengubah output kedua platform menjadi satu schema dan melakukan deduplikasi sebelum data meninggalkan ponsel.
- Pemicu sinkronisasi — 30 hari riwayat pada peluncuran pertama, kemudian pembacaan incremental ringan 1 hari pada interval 10 menit dan pada setiap aplikasi dilanjutkan.
- Transportasi — rollup harian yang dinormalisasi di-POST ke server utama di /user-health/system-activity, yang meneruskannya (dengan ID pengguna + zona waktu) ke microservice kesehatan.
- Persistensi — setiap sumber/hari disimpan secara idempoten sebagai HealthSystemAggregate; MongoDB change stream kemudian merekonsiliasinya menjadi HealthLedger per hari.
Expo / React Native managed workflow dengan modul HealthKit dan Health Connect native.
Fitur Utama
- Satu kontrak normalisasi untuk dua API. Pembaca khusus platform memasok satu langkah formatHealthData yang menghasilkan bentuk yang sama terlepas dari sumbernya — sehingga backend dan UI tidak pernah bercabang berdasarkan iOS vs Android.
2. Deduplikasi berbasis maks di perangkat. Dalam setiap sumber, pembacaan satu hari dijumlahkan; kemudian nilai harian adalah Math.max() lintas sumber (kalori di-key oleh source|deviceType), sehingga beberapa pembacaan dari satu perangkat terakumulasi sementara jam tangan dan telepon yang melaporkan hari yang sama tidak berlipat ganda:
// Sum readings within each source, then take the max ACROSS sources dateSourceMap[date][source] += entry.count; const totalSteps = Math.ceil(Math.max(...Object.values(dateSourceMap[date]))); |
3.Strategi pembacaan yang tepat per platform. Pembacaan Health Connect berhalaman dengan loop pageToken (1.000 catatan/halaman); agregat harian HealthKit diulang hari demi hari. Setiap keunikan terkandung dalam pembacanya sendiri, tidak terlihat oleh bagian aplikasi lainnya.
4. Ritme sinkronisasi yang menghargai baterai. Pengisian ulang 30 hari penuh hanya berjalan sekali (dijaga oleh flag panggilan pertama); setelah itu, setiap sinkronisasi hanya menarik satu hari — cepat pada seluler, hemat daya.
5. Pengelompokan harian yang benar berdasarkan zona waktu. Sampel dikelompokkan ke dalam key YYYY-MM-DD di zona waktu pengguna sendiri, sehingga latihan pada pukul 11 malam jatuh pada hari yang tepat di mana pun server berada.
6. Penulisan backend yang idempoten. Setiap rollup melakukan upsert pada (userId, deviceId, source, date) — mengirim ulang hari yang sama adalah no-op, membuat percobaan ulang dan sinkronisasi yang tumpang tindih aman.
7. Degradasi yang jujur. Izin yang hilang, pembacaan kosong, dan kesalahan batas-laju Health Connect ditangkap dan ditampilkan dengan jelas — hari yang kosong tidak pernah menghentikan sinkronisasi, dan pengguna mendapatkan petunjuk yang jelas alih-alih kegagalan tanpa pemberitahuan.
Hasil
- Satu profil kesehatan yang konsisten di seluruh iOS dan Android — perbedaan platform tidak terlihat oleh bagian aplikasi lainnya.
- Sumber perangkat/aplikasi yang tumpang tindih dideduplikasi, sehingga langkah dan kalori mencerminkan realitas alih-alih jumlah yang digembungkan.
- Sinkronisasi incremental ringan menjaga data tetap segar tanpa menguras baterai atau menghabiskan data seluler.
Penulisan yang benar berdasarkan zona waktu dan idempoten berarti setiap metrik jatuh pada hari yang tepat, dan percobaan ulang tidak pernah merusak catatan.
Tumpukan Teknologi
React Native (Expo) · react-native-health (HealthKit) · react-native-health-connect · NestJS · MongoDB · MongoDB Change Streams · moment-timezone

