LeCodesdocs

Geolocation

Позиция устройства — разовые фиксы и непрерывное слежение. В отличие от QRScanner / CameraView, здесь нет вьюхи, которую нужно показывать: Geolocation — сервисный плагин, типизированная обёртка над зарегистрированным хостом сервисом "geolocation". Опционален по хосту — всегда проверяй Geolocation.isSupported, прежде чем предлагать функции геолокации.

Обзор

TypeScript
if (Geolocation.isSupported) {
  const pos = await Geolocation.getCurrent()
  console.log(pos.latitude, pos.longitude, '±' + pos.accuracy + 'm')
}

API

TypeScript
Geolocation.isSupported: boolean            // статик — зарегистрировал ли этот хост сервис?

Geolocation.getCurrent(options?): Promise<GeoPosition>
Geolocation.watch(cb: (pos: GeoPosition) => void, options?): Promise<{ stop(): void }>

interface GeoPosition {
  latitude: number; longitude: number
  accuracy: number                // горизонтальный радиус, метры
  altitude: number | null        // метры, null если неизвестно
  heading: number | null          // градусы по часовой от севера, null в покое
  speed: number | null            // м/с, null если неизвестно
  timestamp: number               // когда получен фикс, мс epoch
}
interface GeoOptions {
  highAccuracy?: boolean          // предпочесть GPS: медленнее первый фикс, больше батареи (по умолчанию false)
  timeout?: number                // только getCurrent: отклонить "timeout" спустя столько мс
}
  • Системный запрос разрешения происходит при первом вызове (getCurrent или watch) — и никогда раньше. Отказ — это reject (Error("denied")); жди также "unavailable" (нет провайдера) и "timeout". На хостах без сервиса оба метода отклоняются сразу, до любого пути с разрешением.
  • watch() разрешается, когда хост действительно начал слежение (разрешение выдано, провайдер запущен), поэтому отказ — это reject, а не молча мёртвый колбэк. Дальше обновления приходят с той частотой, с которой их отдаёт провайдер платформы.
  • Одно хостовое слежение обслуживает всех подписчиков: два watch() стоят одной GPS-сессии, и побеждают опции того, который её запустил. У каждой подписки свой stop(); последний stop() освобождает провайдер.
Note

жизненный цикл — работающий watch держит железо геолокации (и индикатор ОС) включённым. Всегда вызывай stop(), уходя с экрана (onClose) — то же правило, что закрытие камеры.

Слежение за позицией

TypeScript
const screen = UIScreen(
  UIText(() => label.value).style({ fontSize: 20 }),
)
const label = signal('locating…')

const watch = await Geolocation.watch(pos => {
  label.value = pos.latitude.toFixed(5) + ', ' + pos.longitude.toFixed(5)
})
screen.onClose(() => watch.stop())

Смотрите также