Ir al contenido

Empezar

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

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 utiliza ActivityKit.
  • Agregar el mismo grupo de aplicación a la aplicación objetivo y al objetivo de extensión de widget.
  • Establecer CapgoWidgetKitAppGroup en ambos Info.plist archivos a la identificador de grupo de aplicación compartido.
<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 complemento almacena el estado, resuelve 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 configuración 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 del widget después de lanzar o reanudar:

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 {{...}} templates se resuelven primero.
nextMoverse al siguiente marco desde frameIds o los marcos declarados en surface.
previousMoverse al marco anterior.
toggleAlternar entre los dos primeros marcos disponibles, o entre el marco actual y frameId.

Los IDs de marcos inválidos se ignoran cuando la mutación tiene una lista de marcos 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 / restartComienza desde cero utilizando la duración actual.
pauseAlmacena el tiempo transcurrido y elimina startedAt.
resumeReanuda solo los temporizadores pausados. Los temporizadores detenidos permanecen detenidos hasta que se inicia explícitamente o se reinicia.
togglePausa un temporizador en ejecución o reanuda un temporizador pausado.
resetElimina el tiempo transcurrido y regresa a la inactividad.
stopProgreso de tiempo de ejecución claro y marca el temporizador detenido.
setDurationRecomputar el estado después de un cambio de duración.

Las vinculaciones del 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 un registro de sesión compartido para la aplicación y el widget, así como 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 trabajo que requiere una respuesta posterior, como un widget que solicita a la aplicación sincronizar 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, pasarlo 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 fallido, los llamados repetidos 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 SVGperformTemplateAction, listTemplateEvents, acknowledgeTemplateEvents
Sesiones de widget nativostartWidgetSession, updateWidgetSession, stopWidgetSession, getWidgetSession, listWidgetSessions
Mensajes de widget nativosendWidgetMessage, listWidgetMessages, acknowledgeWidgetMessages, completeWidgetMessage

La referencia de tipo completa se encuentra en el repositorio del plugin en src/definitions.ts.