Saltar al contenido

Getting Started

GitHub

Puede utilizar nuestra configuración asistida por IA para instalar el plugin. Agregue las Capgo habilidades a su herramienta de IA utilizando el siguiente comando:

Ventana de terminal
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

Luego utilice la siguiente solicitud:

Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/capacitor-widget-kit` plugin in my project.

Si prefiere la configuración manual, instale el plugin ejecutando los siguientes comandos y siguiendo las instrucciones específicas de la plataforma a continuación:

Ventana de terminal
bun add @capgo/capacitor-widget-kit
bunx cap sync
import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';

Configuración de iOS

Configuración de iOS

Para actividades en vivo y extensiones de WidgetKit, configure la aplicación nativa primero:

  • Utilice iOS 17+ para botones de actividad en vivo interactivos cuando sea posible.
  • Agregar NSSupportsLiveActivities a la aplicación Info.plist cuando se utilice ActivityKit.
  • Agregar el mismo grupo de aplicación a la meta de la aplicación y a la meta de la extensión de widget.
  • Establecer CapgoWidgetKitAppGroup en ambos Info.plist archivos a la identificador compartido del grupo de aplicación.
<key>CapgoWidgetKitAppGroup</key>
<string>group.app.capgo.widgetkit.exampleapp.widgetkit</string>
const { supported, reason } = await CapgoWidgetKit.areActivitiesSupported();
if (!supported) {
console.log('WidgetKit bridge unavailable:', reason);
}

Utilice este modo cuando el widget pueda renderizar SVG resuelto. El plugin almacena el estado, resuelve los reemplazos de marcadores, aplica acciones de toque, cambia marcos de SVG y mantiene el estado del temporizador consistente.

const { activity } = await CapgoWidgetKit.startTemplateActivity({
activityId: 'workout-session-1',
openUrl: 'myapp://workout/session-1',
state: {
title: 'Chest Day',
frame: 'summary',
restDurationMs: 90000,
},
definition: {
id: 'workout-card',
timers: [
{
id: 'rest',
durationPath: 'state.restDurationMs',
},
],
actions: [
{
id: 'next-frame',
eventName: 'widget.frame.changed',
frameMutations: [
{
op: 'next',
path: 'frame',
surface: 'lockScreen',
},
],
},
{
id: 'toggle-rest',
eventName: 'widget.timer.toggled',
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>`,
},
],
},
},
},
});

Los widgets nativos pueden disparar las mismas acciones a través de su cableado de hotspot/acción. La aplicación también puede ejecutarlas directamente:

await CapgoWidgetKit.performTemplateAction({
activityId: activity.activityId,
actionId: 'toggle-rest',
sourceId: 'app-pause-play-button',
});

Las acciones emiten eventos para que la aplicación pueda procesar las interacciones de los widgets después del arranque o la reanudación:

const { events } = await CapgoWidgetKit.listTemplateEvents({
activityId: activity.activityId,
unacknowledgedOnly: true,
});
for (const event of events) {
console.log('Widget event:', event.eventName, event.state, event.timers);
}
await CapgoWidgetKit.acknowledgeTemplateEvents({
activityId: activity.activityId,
});
await CapgoWidgetKit.updateTemplateActivity({
activityId: activity.activityId,
state: {
title: 'Back Day',
frame: 'summary',
restDurationMs: 120000,
},
});
await CapgoWidgetKit.endTemplateActivity({
activityId: activity.activityId,
state: { title: 'Workout complete', frame: 'summary' },
});

Las mutaciones de marco escriben el id del marco activo en el estado. Un layout puede leerlo luego con frameIdPath.

OperaciónComportamiento
setEstablecer un id de marco específico. Las cadenas de texto planas se tratan como ids de marco literales; los {{...}} plantillas se resuelven primero.
nextPasar a la siguiente imagen. frameIds o las imágenes declaradas en surface.
previousPasar a la imagen anterior.
toggleAlternar entre las dos primeras imágenes disponibles, o entre la imagen actual y frameId.

Los IDs de imagen inválidos se ignoran cuando la mutación tiene una lista de imágenes seleccionables conocida, por lo que el estado se alinea con la superficie renderizada.

Las mutaciones de temporizador apuntan a un temporizador con nombre de definition.timers.

OperaciónComportamiento
start / restartComenzar desde cero utilizando la duración actual.
pauseAlmacenar el tiempo transcurrido y borrar startedAt.
resumeReanuda solo temporizadores pausados. Los temporizadores detenidos permanecen detenidos hasta un reinicio explícito o reinicio.
togglePausa un temporizador en ejecución o reanuda un temporizador pausado.
resetRestablece el tiempo transcurrido y regresa a estado de inactividad.
stopRestablece el progreso de ejecución y marca el temporizador detenido.
setDurationRecomputa el estado después de un cambio de duración.

Las vinculaciones de temporizador están disponibles para SVG como {{timers.<id>.remainingText}}, {{timers.<id>.elapsedMs}}, {{timers.<id>.status}}, y campos relacionados.

Opción 2: Sesión de Widget de Nivel Nativo Completo

Sección titulada “Opción 2: Sesión de Widget de Nivel Nativo Completo”

Utilice este modo cuando la interfaz de usuario del widget se construye en nativo code. El plugin proporciona a la aplicación y al widget un registro de sesión compartido y una cola de mensajes.

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 },
});
const { sessions } = await CapgoWidgetKit.listWidgetSessions();
console.log('Known widget sessions:', sessions);

Los mensajes cubren el trabajo que requiere una respuesta posterior, como un widget que le pide a la aplicación que sincronice datos.

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 },
});

Para fallar el trabajo, pasa error en lugar de response:

await CapgoWidgetKit.completeWidgetMessage({
messageId: message.messageId,
error: 'Network unavailable',
});

completeWidgetMessage es idípoto. Si el mensaje ya está completado o falló, las llamadas repetidas devuelven el snapshot de mensaje existente.

await CapgoWidgetKit.stopWidgetSession({
widgetId: session.widgetId,
state: { isRunning: false },
});
GrupoAPIs
CapacidadareActivitiesSupported, getPluginVersion
Ciclo de vida de actividad SVGstartTemplateActivity, updateTemplateActivity, endTemplateActivity, getTemplateActivity, listTemplateActivities
Acciones y eventos de SVGperformTemplateAction, listTemplateEvents, acknowledgeTemplateEvents
Sesiones de widget nativostartWidgetSession, updateWidgetSession, stopWidgetSession, getWidgetSession, listWidgetSessions
Mensajes de widget nativosendWidgetMessage, listWidgetMessages, acknowledgeWidgetMessages, completeWidgetMessage

El tipo de referencia completo vive en el repositorio del plugin en src/definitions.ts.

Si estás utilizando Inicio para planificar el trabajo de plugin nativo, conecta con Usando @capgo/capacitor-kit-de-widget para la capacidad nativa en Usando @capgo/capacitor-kit-de-widget, Directorio de Plugin de Capgo para el flujo de trabajo del producto en Directorio de Plugin de Capgo, Plugins de Capacitor por Capgo para el detalle de implementación en Plugins de Capacitor por Capgo, Agregar o Actualizar Plugins para el detalle de implementación en Agregar o Actualizar Plugins, y Alternativas de Plugins de Empresa de Ionic para el flujo de trabajo del producto en Alternativas de Ionic Enterprise Plugin.