Медиа и устройства
Команда местоположения
Кратко
location.get— это команда узла (черезnode.invoke).- По умолчанию выключена.
- Настройки используют селектор: Выкл. / При использовании / Всегда.
- Отдельный переключатель: Точное местоположение.
Почему селектор (а не просто переключатель)
Разрешения в ОС многоуровневые. Мы можем отобразить селектор в приложении, но окончательное решение остаётся за операционной системой.
- iOS/macOS: пользователь может выбрать При использовании или Всегда в системных запросах/Настройках. Приложение может запросить повышение уровня, но ОС может потребовать изменения в системных Настройках.
- Android: доступ к местоположению в фоне — это отдельное разрешение; на Android 10+ для его получения часто требуется переход в системные Настройки.
- Точное местоположение — это отдельное разрешение (iOS 14+ «Точное», Android «точное» vs «приблизительное»).
Селектор в интерфейсе определяет запрашиваемый нами режим; фактическое разрешение хранится в настройках ОС.
Модель настроек
Для каждого устройства-узла:
location.enabledMode:off | whileUsing | alwayslocation.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-уведомлением (будущее):
- Шлюз отправляет push-уведомление на узел (тихое уведомление или данные FCM).
- Узел ненадолго активируется и запрашивает местоположение у устройства.
- Узел пересылает полезную нагрузку на Шлюз.
Примечания:
- iOS: требуется разрешение «Всегда» + включён режим фонового обновления местоположения. Тихое push-уведомление может быть ограничено; возможны периодические сбои.
- Android: определение местоположения в фоне может требовать сервис на переднем плане; в противном случае ожидайте отказа.
Интеграция с моделью/инструментами
- Поверхность инструментов: утилита
nodesдобавляет действиеlocation_get(требуется узел). - CLI:
openclaw nodes location get --node <id>. - Рекомендации для агентов: вызывать команду только когда пользователь включил определение местоположения и понимает область его использования.
Текст для интерфейса (предлагаемый)
- Выкл.: «Обмен местоположением отключён».
- При использовании: «Только когда OpenClaw открыт».
- Всегда: «Разрешить определение местоположения в фоне. Требуется системное разрешение».
- Точное: «Использовать точное GPS-местоположение. Отключите, чтобы делиться приблизительным местоположением».