تكرار السؤال: …
الإجابة المختصرة
بتسجيل مهمة خلفية عبر TaskManager و expo-location مع ضبط نوع النشاط ومسافة التحديث، وضمان الحصول على إذن ACCESS_BACKGROUND_LOCATION الصريح.
الشرح
يفرض كلا النظامين قيوداً صارمة جداً على تتبع الموقع أثناء نوم الشاشة لمنع التجسس وتوفير الطاقة. يتطلب أندرويد إظهار خدمة أمامية دائمة (Foreground Service Notification) توضح للمستخدم أن التطبيق يتتبع موقعه، بينما يتطلب iOS تحديد السبب الدقيق في UIBackgroundModes.
مثال بالكود
import * as TaskManager from 'expo-task-manager';
import * as Location from 'expo-location';
const LOCATION_TASK_NAME = 'background-location-task';
TaskManager.defineTask(LOCATION_TASK_NAME, ({ data, error }) => {
if (error) return;
if (data) {
const { locations } = data as any;
console.log("الموقع في الخلفية:", locations);
}
});
// بدء التتبع:
await Location.startLocationUpdatesAsync(LOCATION_TASK_NAME, {
accuracy: Location.Accuracy.Balanced,
distanceInterval: 50, // التحديث كل 50 متراً فقط
showsBackgroundLocationIndicator: true,
});أخطاء شائعة
- استخدام أقصى دقة للموقع (Highest Accuracy) طوال الوقت مما يستنزف كامل طاقة بطارية الهاتف في أقل من ساعتين.