Saltar al contenido principal
@capgo/capacitor-widget-kit UI y Sistema Código abierto

Widget Kit plugin Capacitor

Crea superficies de WidgetKit y Live Activity desde Capacitor con frames SVG, timers, hotspots de acción o sincronización de estado nativo

Instalar

bun add @capgo/capacitor-widget-kit bunx cap sync
npm, pnpm o yarn
  • npm install @capgo/capacitor-widget-kit
  • pnpm add @capgo/capacitor-widget-kit
  • yarn add @capgo/capacitor-widget-kit

Demo

Demos de Widget Kit

Controles de plantillas de WidgetKit y Live Activity mostrados en una demo WebP animada.

Assets de origen
Demo animada de WidgetKit que muestra el estado de los widgets y controles vía Capacitor
Flujo de plantillas de widgets

Guía

Cómo usar Widget Kit en Capacitor

Uso de @capgo/capacitor-widget-kit

@capgo/capacitor-widget-kit permite que una app Capacitor gestione WidgetKit y Live Activity de dos formas:

  • Renderiza superficies de plantillas SVG con cambio de frames, hotspots táctiles y temporizadores de pausa/reproducción.
  • Mantén el widget totalmente nativo mientras la app y el widget comparten el estado de sesión JSON y mensajes asíncronos.

Instalar

bun add @capgo/capacitor-widget-kit
bunx cap sync

Cuándo usar plantillas SVG

Usa plantillas SVG cuando la superficie del widget se pueda describir como un SVG. La app guarda la definición de la plantilla, el bridge nativo resuelve los placeholders y los taps en el widget pueden mutar el estado después.

Casos ideales: timers de entrenamiento, tarjetas de estado de entrega, resultados deportivos o cualquier UI compacta donde cambiar entre frames sea suficiente.

import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';

const { activity } = await CapgoWidgetKit.startTemplateActivity({
  activityId: 'session-1',
  state: {
    title: 'Chest Day',
    frame: 'summary',
    restDurationMs: 90000,
  },
  definition: {
    id: 'workout-card',
    timers: [{ id: 'rest', durationPath: 'state.restDurationMs' }],
    actions: [
      {
        id: 'next-frame',
        frameMutations: [{ op: 'next', path: 'frame', surface: 'lockScreen' }],
      },
      {
        id: 'toggle-rest',
        timerMutations: [{ op: 'toggle', timerId: 'rest' }],
      },
    ],
    layouts: {
      lockScreen: {
        width: 100,
        height: 40,
        frameIdPath: 'state.frame',
        frames: [
          {
            id: 'summary',
            hotspots: [{ id: 'switch', actionId: 'next-frame', x: 0, y: 0, width: 100, height: 40 }],
            svg: `<svg viewBox="0 0 100 40"><text x="6" y="22">{{state.title}}</text></svg>`,
          },
          {
            id: 'timer',
            hotspots: [{ id: 'pause-play', actionId: 'toggle-rest', x: 0, y: 0, width: 100, height: 40 }],
            svg: `<svg viewBox="0 0 100 40"><text x="6" y="22">{{timers.rest.remainingText}}</text></svg>`,
          },
        ],
      },
    },
  },
});

Gestionar acciones del widget en la app

Las acciones del widget se guardan como eventos. Léelos y confírmalos al reanudar la app o tras una sincronización en segundo plano.

const { events } = await CapgoWidgetKit.listTemplateEvents({
  activityId: activity.activityId,
  unacknowledgedOnly: true,
});

for (const event of events) {
  console.log(event.actionId, event.state, event.timers);
}

await CapgoWidgetKit.acknowledgeTemplateEvents({ activityId: activity.activityId });

Cuándo usar sesiones Full-Native

Usa sesiones full-native cuando la UI del widget se construya mejor directamente en Swift, Kotlin o Java. Capacitor sigue gestionando el inicio y fin de la sesión, mantiene el estado compartido y encola el trabajo entre la app y el widget code.

const { session } = await CapgoWidgetKit.startWidgetSession({
  widgetId: 'native-session-1',
  kind: 'workout-controls',
  state: { isRunning: true, selectedSetId: 'set-1' },
  metadata: { accent: '#00d69c' },
});

await CapgoWidgetKit.updateWidgetSession({
  widgetId: session.widgetId,
  merge: true,
  state: { isRunning: false },
});

Encola trabajo asíncrono entre el widget y la app

Los mensajes pueden fluir de la app al widget o viceversa. Permanecen pendientes hasta que se confirman y completan.

const { message } = await CapgoWidgetKit.sendWidgetMessage({
  widgetId: session.widgetId,
  direction: 'widgetToApp',
  name: 'syncWorkoutSet',
  payload: { setId: 'set-1' },
  expectsResponse: true,
});

await CapgoWidgetKit.acknowledgeWidgetMessages({ messageIds: [message.messageId] });

await CapgoWidgetKit.completeWidgetMessage({
  messageId: message.messageId,
  response: { synced: true },
});

Si la tarea falla, completa el mensaje con un error:

await CapgoWidgetKit.completeWidgetMessage({
  messageId: message.messageId,
  error: 'Sync failed',
});

Detén las sesiones correctamente

await CapgoWidgetKit.endTemplateActivity({
  activityId: activity.activityId,
  state: { title: 'Workout complete', frame: 'summary' },
});

await CapgoWidgetKit.stopWidgetSession({
  widgetId: session.widgetId,
  state: { isRunning: false },
});

Notas de configuración nativa

Para iOS WidgetKit y Live Activities, configura un App Group en los targets de la app y de la extensión del widget y establece CapgoWidgetKitAppGroup en ambos Info.plist files. Los botones interactivos requieren una extensión de widget que conecte el bridge nativo del plugin con el action intent.

Referencia completa

Continuar desde Uso de @capgo/capacitor-widget-kit

Si estás usando Uso de @capgo/capacitor-widget-kit para planificar el trabajo con plugins nativos, conéctalo con @capgo/capacitor-widget-kit para los detalles de implementación en @capgo/capacitor-widget-kit, Primeros pasos para los detalles de implementación en Primeros pasos, Directorio de plugins de Capgo para el flujo de trabajo del producto en Capgo Plugin Directory, Plugins de Capacitor por Capgo para los detalles de implementación en Capacitor Plugins de Capgo, y Añadir o actualizar plugins para los detalles de implementación al añadir o actualizar plugins.

FAQ

FAQ del plugin Widget Kit

¿Cómo instalo el plugin Widget Kit en una app Capacitor?

Ejecuta "bun add @capgo/capacitor-widget-kit" (o "npm install @capgo/capacitor-widget-kit"), luego ejecuta "bunx cap sync" para que los proyectos de iOS y Android reconozcan el code nativo. Impórtalo desde "@capgo/capacitor-widget-kit" en el code de tu app.

¿Es compatible @capgo/capacitor-widget-kit con React, Vue y Angular?

Sí. Widget Kit es un paquete Capacitor, por lo que funciona con cualquier framework web que se ejecute dentro de Capacitor, incluyendo Ionic, React, Vue, Angular, Svelte y JavaScript puro.

¿Qué versión de Capacitor es compatible con @capgo/capacitor-widget-kit?

Los plugins de Capgo siguen la versión mayor de Capacitor: usa la versión mayor del plugin que coincida con la versión mayor de tu Capacitor (por ejemplo, el plugin v8 con Capacitor 8). La tabla de compatibilidad del README de GitHub lista las versiones mantenidas.

¿Es @capgo/capacitor-widget-kit gratuito y de código abierto?

Sí. El código fuente de code es público en GitHub en https://github.com/Cap-go/capacitor-widget-kit/ y el paquete se puede instalar gratis desde npm. Aceptamos reportes de errores y pull requests.

¿Puedo actualizar code que usa Widget Kit sin pasar por la revisión de la App Store?

Instalar o actualizar el plugin cambia el code nativo, así que requiere un nuevo build para la tienda. Después, los cambios de JavaScript, HTML y CSS que llamen al plugin se pueden publicar al instante con las live updates de Capgo.

Lanza cambios en Widget Kit sin esperar la revisión de la app

Una vez que el plugin esté en tu store build, Capgo live updates envía tus cambios de JavaScript, HTML y CSS a los usuarios en minutos.

Empieza con Capgo