Geolocation
Позиция устройства — разовые фиксы и непрерывное слежение. В отличие от QRScanner /
CameraView, здесь нет вьюхи, которую нужно показывать: Geolocation — сервисный
плагин, типизированная обёртка над зарегистрированным хостом сервисом "geolocation".
Опционален по хосту — всегда проверяй Geolocation.isSupported, прежде чем предлагать
функции геолокации.
Обзор
if (Geolocation.isSupported) {
const pos = await Geolocation.getCurrent()
console.log(pos.latitude, pos.longitude, '±' + pos.accuracy + 'm')
}API
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) — то же правило, что закрытие камеры.
Слежение за позицией
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())Смотрите также
- Соглашения — гейтинг хоста —
защиты
isSupported(Physics.supported,QRScanner.isSupported) - QRScanner / CameraView — плагины в форме вьюхи; Geolocation — та же идея минус UI-поверхность