الانتقال إلى المحتوى الرئيسي

أمر الموقع (العُقد)

TL;DR

  • location.get هو أمر عُقدة (عبر node.invoke).
  • مُعطَّل افتراضيًا.
  • تستخدم الإعدادات مُحدِّدًا: إيقاف / أثناء الاستخدام / دائمًا.
  • مفتاح تبديل منفصل: الموقع الدقيق.

لماذا مُحدِّد (وليس مجرد مفتاح)

أذونات أنظمة التشغيل متعددة المستويات. يمكننا عرض مُحدِّد داخل التطبيق، لكن نظام التشغيل هو من يقرر المنح الفعلي.
  • iOS/macOS: يمكن للمستخدم اختيار أثناء الاستخدام أو دائمًا في مطالبات النظام/الإعدادات. يمكن للتطبيق طلب ترقية، لكن النظام قد يتطلب الذهاب إلى الإعدادات.
  • Android: الموقع في الخلفية إذن منفصل؛ وعلى Android 10+ غالبًا ما يتطلب مسار إعدادات.
  • الموقع الدقيق إذن منفصل (iOS 14+ «Precise»، وAndroid «fine» مقابل «coarse»).
المُحدِّد في واجهة المستخدم يوجّه وضع الطلب لدينا؛ أما المنح الفعلي فيوجد في إعدادات نظام التشغيل.

نموذج الإعدادات

لكل جهاز عُقدة:
  • location.enabledMode: off | whileUsing | always
  • location.preciseEnabled: bool
سلوك واجهة المستخدم:
  • اختيار whileUsing يطلب إذن المقدّمة.
  • اختيار always يضمن أولًا whileUsing، ثم يطلب الخلفية (أو يرسل المستخدم إلى الإعدادات إذا لزم).
  • إذا رفض نظام التشغيل المستوى المطلوب، يتم الرجوع إلى أعلى مستوى ممنوح مع إظهار الحالة.

تعيين الأذونات (node.permissions)

اختياري. تُبلِغ عُقدة macOS عن location عبر خريطة الأذونات؛ وقد تُهملها iOS/Android.

الأمر: location.get

يُستدعى عبر node.invoke. المعلمات (مقترحة):
{
  "timeoutMs": 10000,
  "maxAgeMs": 15000,
  "desiredAccuracy": "coarse|balanced|precise"
}
حمولة الاستجابة:
{
  "lat": 48.20849,
  "lon": 16.37208,
  "accuracyMeters": 12.5,
  "altitudeMeters": 182.0,
  "speedMps": 0.0,
  "headingDeg": 270.0,
  "timestamp": "2026-01-03T12:34:56.000Z",
  "isPrecise": true,
  "source": "gps|wifi|cell|unknown"
}
الأخطاء (رموز مستقرة):
  • LOCATION_DISABLED: المُحدِّد مُعطَّل.
  • LOCATION_PERMISSION_REQUIRED: الإذن مفقود للوضع المطلوب.
  • LOCATION_BACKGROUND_UNAVAILABLE: التطبيق في الخلفية لكن المسموح فقط «أثناء الاستخدام».
  • LOCATION_TIMEOUT: لم يتم الحصول على إحداثية في الوقت المحدد.
  • LOCATION_UNAVAILABLE: فشل في النظام / لا مزوّدين.

السلوك في الخلفية (مستقبلي)

الهدف: تمكين النموذج من طلب الموقع حتى عندما تكون العُقدة في الخلفية، ولكن فقط عندما:
  • يختار المستخدم دائمًا.
  • يمنح نظام التشغيل موقع الخلفية.
  • يُسمح للتطبيق بالعمل في الخلفية للموقع (وضع الخلفية في iOS / خدمة أمامية في Android أو سماح خاص).
تدفّق مُحفَّز بالإشعارات (مستقبلي):
  1. يرسل Gateway إشعارًا إلى العُقدة (إشعار صامت أو بيانات FCM).
  2. تستيقظ العُقدة لفترة وجيزة وتطلب الموقع من الجهاز.
  3. تُمرِّر العُقدة الحمولة إلى Gateway.
ملاحظات:
  • iOS: يتطلب إذن «دائمًا» + وضع الموقع في الخلفية. قد يتم تقييد الإشعار الصامت؛ توقّع إخفاقات متقطعة.
  • Android: قد يتطلب الموقع في الخلفية خدمة أمامية؛ وإلا فتوقّع الرفض.

تكامل النموذج/الأدوات

  • سطح الأدوات: أداة nodes تضيف إجراء location_get (العُقدة مطلوبة).
  • CLI: openclaw nodes location get --node <id>.
  • إرشادات الوكيل: لا تُستدعِ إلا عندما يكون المستخدم قد فعّل الموقع ويفهم النطاق.

نسخة UX (مقترح)

  • إيقاف: «مشاركة الموقع مُعطَّلة.»
  • أثناء الاستخدام: «فقط عندما يكون OpenClaw مفتوحًا.»
  • دائمًا: «السماح بالموقع في الخلفية. يتطلب إذن النظام.»
  • دقيق: «استخدام موقع GPS الدقيق. أوقفه لمشاركة موقع تقريبي.»