לקוח השיק מעקב ב-iOS עם desiredAccuracy: .bestForNavigation — הסוללה התרוקנה תוך שעה. נאלצנו לעצב מחדש את המחסנית עם מצב אדפטיבי: ברקע — kCLLocationAccuracyHundredMeters, מסך כבוי — Significant Location Changes API. אנחנו צוות פיתוח מובייל המתמחה במערכות גיאולוקציה עבור iOS, Android ו-Flutter. אנו מסייעים בהטמעת מעקב גיאולוקציה אמין בזמן אמת, תוך התחשבות בכל מגבלות הפלטפורמה ואופטימיזציה של צריכת החשמל. שגיאות בתצורת מנהל המיקום גורמות ל-80% מהתלונות על התרוקנות סוללה ואובדן דיוק.
היכן נוצרות בעיות במעקב גיאולוקציה בזמן אמת
הטעות הנפוצה ביותר היא אי הפרדה בין מצבי חזית ורקע. בחזית ניתן להריץ CLLocationManager עם desiredAccuracy: .bestForNavigation ו-distanceFilter: 5 — המשתמש מסתכל באופן פעיל על המפה. ברקע, אותו מצב הורג את הסוללה תוך שעתיים. ב-Android, מאז Android 8, המערכת הורגת באגרסיביות תהליכי רקע. LocationManager.requestLocationUpdates() מ-Service ללא startForeground() מפסיק לקבל עדכונים לאחר מספר דקות. MIUI ו-One UI עם הגדרות "Battery Optimization" מאיצות את זה עוד יותר — ללא קשר להגדרות המפתח. כתוצאה מכך, הדיוק יורד והמשתמשים מאבדים אמון.
כיצד להבטיח דיוק גיאולוקציה ברקע?
מחסנית וארכיטקטורה
iOS
למצב חזית — CLLocationManager עם CLLocationAccuracy.best, קריאה חוזרת ב-didUpdateLocations. למצב רקע — allowsBackgroundLocationUpdates = true + יכולת "Background Modes → Location updates" ב-entitlements. ללא דגל זה, עדכוני רקע פשוט לא מגיעים. אנו מאגרים קואורדינטות מקומית (מערך בזיכרון או Core Data) ושולחים בקבוצות דרך URLSession.shared.uploadTask כל N שניות או לאחר צבירת K נקודות. שליחת בקשות HTTP בודדות לכל עדכון היא אנטי-פטרן.
כדי לחסוך בסוללה אנו מחליפים מצבים לפי הקשר:
- אפליקציה פעילה:
desiredAccuracy = kCLLocationAccuracyBest,distanceFilter = 10 - מסך כבוי:
desiredAccuracy = kCLLocationAccuracyHundredMeters,distanceFilter = 50 - מצב "מעקב ארוך": Significant Location Changes API במקום ניטור רציף
Android
FusedLocationProviderClient מ-play-services-location הוא הבחירה הנכונה היחידה. ה-LocationManager של הפלטפורמה נותן פחות שליטה.
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 5_000L)
.setMinUpdateDistanceMeters(10f)
.setWaitForAccurateLocation(false)
.build()
fusedLocationClient.requestLocationUpdates(
request,
locationCallback,
Looper.getMainLooper()
)מעקב ברקע — רק דרך Foreground Service עם התראה. לא ניתן להסתיר את ההתראה לפי דרישות Android 9+. בעת ערפול עם ProGuard/R8, אל תשכחו להוסיף כללי keep עבור Room וסריאליזציה — אחרת קואורדינטות אובדות.
Flutter
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 5_000L) .setMinUpdateDistanceMeters(10f) .setWaitForAccurateLocation(false) .build() fusedLocationClient.requestLocationUpdates( request, locationCallback, Looper.getMainLooper() ) לקבלת מיקומים, geolocator (בתשלום, אך אמין) למצב רקע. קואורדינטות דרך Isolate נשמרות ב-Isar, מסונכרנות דרך Dio עם לוגיקת retry.
| מצב | דיוק | תדירות | צריכת סוללה | מקרה שימוש |
|---|---|---|---|---|
| חזית (iOS) | Best | כל 5 מ' | גבוהה | מפה פעילה |
| רקע (iOS) | HundredMeters | כל 50 מ' | נמוכה | מעקב ארוך |
| חזית (Android) | HIGH_ACCURACY | כל 5 שניות | גבוהה | ניווט |
| רקע (Android) | BALANCED_POWER_ACCURACY | כל 30 שניות | בינונית | איסוף ברקע |
למה MQTT עדיף על WebSocket למעקב?
אם צריך להציג מיקומים למשתמשים אחרים בזמן אמת, HTTP polling לא עובד. WebSocket (flutter_background_geolocation או socket.io / URLSessionWebSocketTask מקורי) ו-MQTT הם האפשרויות העיקריות. MQTT קל יותר על התעבורה ומתמודד טוב יותר עם חיבורים לא יציבים. בבדיקות עם שירות שליחים על 500 מכשירים, MQTT עם QoS 1 הראה השהיה מתחת ל-100 אלפיות השנייה ואובדן נתונים של 0.3%. עבור Flutter אנו משתמשים בחבילת OkHttp WebSocket. השוואת פרוטוקולים מאשרת ש-MQTT צורך 60% פחות תעבורה באותה תדירות עדכון.
| פרוטוקול | השהיית תעבורה | צריכת תעבורה | אמינות בניתוק | מצב רקע |
|---|---|---|---|---|
| WebSocket | 50–200 אלפיות השנייה | גבוהה (keep-alive קבוע) | בינונית (חיבור מחדש לאחר שניות) | iOS — URLSessionWebSocketTask, Android — OkHttp |
| MQTT | <100 אלפיות השנייה | נמוכה (QoS 0/1/2, כותרות קטנות) | גבוהה (חיבור מחדש אוטומטי, סשן מתמשך) | כן, דרך ספריות בכל הפלטפורמות |
כיצד להתמודד עם אובדן חיבור?
אגירה היא אלמנט מפתח. ב-iOS אנו משתמשים ב-Core Data, ב-Android — ב-Room, ב-Flutter — ב-Isar. כשהרשת חוזרת, אנו שולחים נתונים מצטברים דרך WorkManager עם אילוצי סוג רשת (Wi-Fi בלבד או כל). בפרויקט שליחים אחד, אגירה הבטיחה מסירה של 99.9% מהנקודות גם במהלך הפסקות חיבור במנהרות. בנוסף, אנו מיישמים תורי עדיפות: קואורדינטות דחופות (שינוי סטטוס) נשלחות ראשונות.
טעויות אופייניות בהטמעת מעקב
- שליחת כל קואורדינטה כבקשת HTTP נפרדת — מכפילה תעבורה ומעכבת.
- התעלמות מ-
mqtt_clientב-Android — גורמת להפעלות מיותרות ולתרוקנות סוללה. - חוסר בלוגיקת retry בשליחה — אובדן נתונים במהלך כשלי רשת זמניים.
- ערפול שגוי (ProGuard/R8) — קריסת סריאליזציה וקריסת אפליקציה.
מה כוללת העבודה שלנו
- ניתוח דרישות ועיצוב ארכיטקטורת מעקב תוך התחשבות במגבלות פלטפורמה.
- הטמעת איסוף קואורדינטות ב-iOS (Swift) וב-Android (Kotlin) עם מעקב אדפטיבי.
- הגדרת צד שרת (WebSocket/MQTT) לשידור בזמן אמת.
- אגירה וסנכרון בעת אובדן חיבור.
- בדיקות על מכשירים אמיתיים בתנאים שונים (רכבת תחתית, מנהרות, קישוריות חלשה).
- תיעוד API והוראות פריסה.
- חודש תמיכה לאחר המסירה.
התהליך שלנו
- ניתוח: אנו דנים במצבי מעקב, מרווחים, פרוטוקולים. צרו קשר לייעוץ ראשוני.
- עיצוב: ארכיטקטורה, בחירת מחסנית, סכמת נתונים.
- הטמעה: iOS ו/או Android עם ניהול נכון של מחזור חיי השירות.
- הטמעת צד שרת לקבלת קואורדינטות (במידת הצורך).
- בדיקות: נסיעות אמיתיות, מעבר רשת/ללא רשת, בדיקות סוללה.
- פריסה לחנויות ולשרת.
לוחות זמנים משוערים
מ-3 עד 8 ימי עבודה לכל פלטפורמה (iOS או Android), כולל אינטגרציה עם השרת הקיים שלכם. התמחור מחושב באופן אישי לאחר ניתוח הפרויקט.
ניסיון ואחריות
מעל 5 שנות ניסיון בפיתוח מובייל, יותר מ-20 פרויקטי גיאולוקציה שהושלמו, 98% שביעות רצון לקוחות. אנו משתמשים בגישות מודרניות: מעקב אדפטיבי, MQTT, שידור נתונים מאובטח (TLS). אנו מבטיחים פעולה יציבה של הפונקציונליות המיושמת למשך חודש לאחר המסירה. צרו קשר לייעוץ הנדסי — נכין הצעה המותאמת לדרישותיכם. בקשו הערכת פרויקט.







