LeCodesdocs

Service

Прямой доступ к зарегистрированному хостом headless-сервису — собрату NativeView без UI. Сервис — это нативный код, который хост зарегистрировал под именем (engine.registerService("app.battery") { params, channel in … } на iOS); приложение общается с ним через JSON-сессию вызовов/событий. Первопартийные сервисы поставляются с типизированными обёртками (Geolocation, Push) — Service для всего остального: нативного кода, который ты написал в собственной оболочке приложения, и сторонних плагинов без библиотеки-обёртки.

Опционален по хосту, как и любой плагин: веб-редактор не регистрирует ни одного сервиса, поэтому всегда проверяй Service.isSupported(name).

TypeScript
if (Service.isSupported("app.battery")) {
  const battery = Service("app.battery")
  battery.on("change", data => { levelText.text = data.level + "%" })
  const { level, charging } = await battery.call("level")
}

API

  • Service(name, params?) — клиент именованного сервиса. Сессия хоста открывается лениво при первом call(); в этот момент params передаются фабрике хоста.
  • Service.isSupported(name) — зарегистрировал ли этот хост фабрику под именем name.
  • .call(method, ...args) — вызвать метод; аргументы и результат сериализуются в JSON. Отклоняется, если у хоста нет такого сервиса или нативная сторона сообщила об ошибке.
  • .on(event, cb) / .off(event, cb) — подписка на события, которые сервис шлёт, пока открыта сессия. Полезные нагрузки приходят уже декодированными из JSON.
  • .close() — закрыть сессию хоста (нативная сторона останавливает свою работу). Слушатели остаются зарегистрированными; последующий call() открывает свежую сессию, которая снова доставляет им события.

Именование

Первопартийные сервисы владеют голыми именами (geolocation, push). Локальные сервисы приложения называй app.* (app.battery), сервисы сторонних плагинов — с вендорным префиксом (acme.bluetooth) — голые имена зарезервированы за SDK.

Для разового синхронного значения (без событий, без async) хостовый engine.registerCallback("native.thing") { … }, внедряющий обычный глобал, может быть проще сервиса — см. документацию оболочки приложения. Берись за Service, как только нужны события, асинхронная работа или состояние сессии.