Getting Started
Copia un prompt di configurazione con i passaggi di installazione e la guida markdown completa per questo plugin.
Set up this Capacitor plugin in the project.
Use the package manager already used by the project.
Install these package(s): `@capgo/capacitor-widget-kit`
Run the required Capacitor sync/update step after installation.
Read this markdown guide for the full setup steps: https://raw.githubusercontent.com/Cap-go/website/refs/heads/main/apps/docs/src/content/docs/docs/plugins/widget-kit/getting-started.mdx
Use that guide for platform-specific steps, native file edits, permissions, config changes, imports, and usage setup.
If that guide references other docs pages, read them too.
Installa
Sezione intitolata “Installa”bun add @capgo/capacitor-widget-kitbunx cap syncImporta
Sezione intitolata “Importa”import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';Configurazione iOS
Sezione intitolata “Configurazione iOS”Per le attività in tempo reale e le estensioni di WidgetKit, configurare l'app nativa per primo:
- Usa iOS 17+ per i pulsanti di attività in tempo reale interattivi quando possibile.
- Aggiungi
NSSupportsLiveActivitiesalla appInfo.plistquando si utilizza ActivityKit. - Aggiungi lo stesso gruppo di app alla destinazione dell'app e alla destinazione dell'estensione del widget.
- Imposta
CapgoWidgetKitAppGroupin entrambiInfo.plisti file al riconoscimento del gruppo di app condiviso.
<key>CapgoWidgetKitAppGroup</key><string>group.app.capgo.widgetkit.exampleapp.widgetkit</string>Verifica il supporto
Sezione intitolata “Verifica il supporto”const { supported, reason } = await CapgoWidgetKit.areActivitiesSupported();
if (!supported) { console.log('WidgetKit bridge unavailable:', reason);}Opzione 1: Modello di attività SVG
Sezione intitolata “Opzione 1: Modello di attività SVG”Utilizza questo modo quando il widget può renderizzare l'SVG risolto. Il plugin memorizza lo stato, risolve i placeholder, applica le azioni di tocco, passa alle frame SVG e mantiene lo stato del timer coerente.
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>`, }, ], }, }, },});Esegui azioni dal'app
Sezione intitolata “Esegui azioni dal'app”I widget nativi possono attivare le stesse azioni attraverso la loro configurazione hotspot/action. L'app può eseguirle direttamente:
await CapgoWidgetKit.performTemplateAction({ activityId: activity.activityId, actionId: 'toggle-rest', sourceId: 'app-pause-play-button',});Processi degli eventi del widget
Sezione intitolata “Processi degli eventi del widget”Gli azioni emettono eventi in modo che l'app possa elaborare le interazioni del widget dopo il lancio o il ripristino:
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,});Aggiorna o termina l'attività
Sezione intitolata “Aggiorna o termina l'attività”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' },});Mutazioni del frame
Sezione intitolata “Mutazioni del frame”Le mutazioni del frame scrivono l'ID del frame attivo nello stato. Un layout può poi leggerlo con frameIdPath.
| Operazione | Comportamento |
|---|---|
set | Imposta un ID di frame specifico. Le stringhe piane vengono trattate come ID di frame letterali; {{...}} i template vengono risolti per primi. |
next | Passa al prossimo frame da frameIds o dai frame dichiarati su surface. |
previous | Passa al frame precedente. |
toggle | Alternare tra i primi due frame disponibili, o tra il frame corrente e frameId. |
Il ID di frame non validi vengono ignorati quando la mutazione ha una lista di frame selezionabili nota, quindi lo stato rimane allineato con la superficie visualizzata.
Mutazioni del timer
Sottosezione intitolata “Mutazioni del timer”Le mutazioni del timer mirano a un timer denominato da definition.timers.
| Operazione | Comportamento |
|---|---|
start / restart | Avvia da zero utilizzando la durata corrente. |
pause | Memorizza il tempo trascorso e cancella startedAt. |
resume | Sospesi i timer rimangono sospesi fino a un avvio esplicito o riavvio. |
toggle | Sospendi un timer in esecuzione o riprendi un timer sospeso. |
reset | Cancella il tempo trascorso e torna allo stato di attesa. |
stop | Cancella il progresso di esecuzione e segnala il timer come fermato. |
setDuration | Ricalcola lo stato dopo un cambio di durata. |
I legami del timer sono disponibili per SVG come {{timers.<id>.remainingText}}, {{timers.<id>.elapsedMs}}, {{timers.<id>.status}}e campi correlati.
Opzione 2: Sessione del widget nativo a piena immersione
Sottosezione intitolata “Opzione 2: Sessione del widget nativo a piena immersione”Utilizza questo modo quando l'interfaccia del widget è costruita in nativo code. Il plugin fornisce al'app e al widget un registro di sessione condiviso e una coda di messaggi.
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);Messaggi Widget Asincroni
Sezione intitolata “Messaggi Widget Asincroni”I messaggi coprono il lavoro che richiede una risposta successiva, come un widget che chiede all'app di sincronizzare i dati.
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 },});Per fallire il lavoro, passa error invece di response:
await CapgoWidgetKit.completeWidgetMessage({ messageId: message.messageId, error: 'Network unavailable',});completeWidgetMessage È idempotente. Se il messaggio è già completato o fallito, le chiamate ripetute restituiscono lo snapshot del messaggio esistente.
Interrompi una Sessione Nativa
Sezione intitolata “Interrompi una Sessione Nativa”await CapgoWidgetKit.stopWidgetSession({ widgetId: session.widgetId, state: { isRunning: false },});Gruppi protetti da API
Sezione intitolata “API Gruppi”| Gruppo | API |
|---|---|
| Capacità | areActivitiesSupported, getPluginVersion |
| Ciclo di vita dell'attività SVG | startTemplateActivity, updateTemplateActivity, endTemplateActivity, getTemplateActivity, listTemplateActivities |
| Azioni e eventi SVG | performTemplateAction, listTemplateEvents, acknowledgeTemplateEvents |
| Sessioni di widget nativo | startWidgetSession, updateWidgetSession, stopWidgetSession, getWidgetSession, listWidgetSessions |
| Messaggi di widget nativo | sendWidgetMessage, listWidgetMessages, acknowledgeWidgetMessages, completeWidgetMessage |
Fonte di Verità
Sezione intitolata “Fonte di Verità”La referenza di tipo completa vive nel repository del plugin su src/definitions.ts.
Continua da Getting Started
Sezione intitolata “Continua da Getting Started”Se stai utilizzando Getting Started per pianificare il lavoro di plugin nativi, connettilo con Utilizzando @capgo/capacitor-kit-di-widget per la capacità nativa in Utilizzando @capgo/capacitor-kit-di-widget, Directory dei plugin Capgo per il flusso di lavoro del prodotto in Directory dei plugin Capgo, Plugin Capacitor sviluppati da Capgo per la dettaglio di implementazione in Plugin Capacitor sviluppati da Capgo, Aggiunta o Aggiornamento dei Plugin per i dettagli di implementazione in Aggiungere o Aggiornare Plugin, e Alternative per Plugin Enterprise Ionic per il flusso di lavoro del prodotto in Alternative Plugin Enterprise Ionic.