Getting Started
Copia un prompt di installazione con i passaggi 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.
Installazione
Sezione intitolata “Installazione”Puoi utilizzare la nostra configurazione assistita da AI per installare il plugin. Aggiungi le Capgo competenze al tuo strumento AI utilizzando il seguente comando:
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-pluginsPoi utilizza il seguente prompt:
Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/capacitor-widget-kit` plugin in my project.Se preferisci la configurazione manuale, installa il plugin eseguendo i seguenti comandi e segui le istruzioni specifiche del tuo sistema di sotto:
bun add @capgo/capacitor-widget-kitbunx cap syncImportazione
Sezione intitolata “Importazione”import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';Per le attività Live e le estensioni di WidgetKit, configurare l'app nativa per primo:
- Usare iOS 17+ per pulsanti di attività Live interattivi quando possibile.
- Aggiungi
NSSupportsLiveActivitiescontenutoInfo.plistAggiungilo all'app - Aggiungi lo stesso gruppo di app al target dell'app e al target dell'estensione del widget.
- Set
CapgoWidgetKitAppGroupImpostaInfo.plistfile al identificatore di gruppo App condiviso.
<key>CapgoWidgetKitAppGroup</key><string>group.app.capgo.widgetkit.exampleapp.widgetkit</string>Verifica il Supporto
Sottosezione intitolata “Verifica il Supporto”const { supported, reason } = await CapgoWidgetKit.areActivitiesSupported();
if (!supported) { console.log('WidgetKit bridge unavailable:', reason);}Opzione 1: Attività del template SVG
Sottosezione intitolata “Opzione 1: Attività del template 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>`, }, ], }, }, },});Eseguire azioni dal'app
Sottosezione intitolata “Eseguire azioni dal'app”I widget nativi possono attivare le stesse azioni attraverso la loro configurazione hotspot/action. L'app può eseguirle direttamente anche:
await CapgoWidgetKit.performTemplateAction({ activityId: activity.activityId, actionId: 'toggle-rest', sourceId: 'app-pause-play-button',});Processa gli eventi del widget
Sezione intitolata “Processa gli eventi del widget”Azioni emettono eventi in modo che l'app possa elaborare le interazioni dei 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 semplici sono trattate come ID di frame letterali; {{...}} Le template vengono risolte 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. |
Idd 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 | Inizia da zero utilizzando la durata corrente. |
pause | Memorizza il tempo trascorso e cancella startedAt. |
resume | Riprendi solo i timer sospesi. I timer fermati restano fermati fino a un avvio esplicito o riavvio. |
toggle | Pausa 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 segna il timer come fermato. |
setDuration | Ricalcola lo stato dopo un cambio di durata. |
I binding dei timer sono disponibili per SVG come {{timers.<id>.remainingText}}, {{timers.<id>.elapsedMs}}, {{timers.<id>.status}}e campi correlati.
Opzione 2: Sessione del widget nativo completo
Sezione intitolata “Opzione 2: Sessione del widget nativo completo”Usa questo modo quando l'interfaccia utente del widget è costruita in nativo code. Il plugin fornisce all'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
Sottosezione 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 al posto 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
Sottosezione intitolata “Interrompi una Sessione Nativa”await CapgoWidgetKit.stopWidgetSession({ widgetId: session.widgetId, state: { isRunning: false },});API Gruppi
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 widget native | startWidgetSession, updateWidgetSession, stopWidgetSession, getWidgetSession, listWidgetSessions |
| Messaggi widget native | sendWidgetMessage, listWidgetMessages, acknowledgeWidgetMessages, completeWidgetMessage |
Fonte di Verità
Sezione intitolata “Fonte di Verità”La riferimento completo di tipo si trova nel repository del plugin in src/definitions.ts.
Continua da Getting Started
Sezione intitolata “Continua da Getting Started”Se stai utilizzando Getting Started per pianificare il lavoro di plugin nativo, connettilo con Utilizza @capgo/capacitor-widget-kit per la capacità nativa in Utilizza @capgo/capacitor-widget-kit Capgo Directory dei plugin per il workflow del prodotto nella Capgo Directory dei Plugin. Capacitor Plugin di Capgo per il dettaglio di implementazione in Capacitor Plugin di Capgo Aggiunta o Aggiornamento Plugin per i dettagli di implementazione in Aggiunta o Aggiornamento Plugin, e Alternative Plugin Enterprise Ionic per il flusso di lavoro del prodotto in Alternative Plugin Enterprise Ionic.