Медиа и устройства

Команда местоположения

Кратко

  • location.get — это команда узла (через node.invoke).
  • По умолчанию выключена.
  • Настройки используют селектор: Выкл. / При использовании / Всегда.
  • Отдельный переключатель: Точное местоположение.

Почему селектор (а не просто переключатель)

Разрешения в ОС многоуровневые. Мы можем отобразить селектор в приложении, но окончательное решение остаётся за операционной системой.

  • iOS/macOS: пользователь может выбрать При использовании или Всегда в системных запросах/Настройках. Приложение может запросить повышение уровня, но ОС может потребовать изменения в системных Настройках.
  • Android: доступ к местоположению в фоне — это отдельное разрешение; на Android 10+ для его получения часто требуется переход в системные Настройки.
  • Точное местоположение — это отдельное разрешение (iOS 14+ «Точное», Android «точное» vs «приблизительное»).

Селектор в интерфейсе определяет запрашиваемый нами режим; фактическое разрешение хранится в настройках ОС.

Модель настроек

Для каждого устройства-узла:

  • 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).

Поток, инициируемый push-уведомлением (будущее):

  1. Шлюз отправляет push-уведомление на узел (тихое уведомление или данные FCM).
  2. Узел ненадолго активируется и запрашивает местоположение у устройства.
  3. Узел пересылает полезную нагрузку на Шлюз.

Примечания:

  • iOS: требуется разрешение «Всегда» + включён режим фонового обновления местоположения. Тихое push-уведомление может быть ограничено; возможны периодические сбои.
  • Android: определение местоположения в фоне может требовать сервис на переднем плане; в противном случае ожидайте отказа.

Интеграция с моделью/инструментами

  • Поверхность инструментов: утилита nodes добавляет действие location_get (требуется узел).
  • CLI: openclaw nodes location get --node <id>.
  • Рекомендации для агентов: вызывать команду только когда пользователь включил определение местоположения и понимает область его использования.

Текст для интерфейса (предлагаемый)

  • Выкл.: «Обмен местоположением отключён».
  • При использовании: «Только когда OpenClaw открыт».
  • Всегда: «Разрешить определение местоположения в фоне. Требуется системное разрешение».
  • Точное: «Использовать точное GPS-местоположение. Отключите, чтобы делиться приблизительным местоположением».

Голосовое пробуждениеПреобразование текста в речь