Démarrage
Copier un prompt de configuration avec les étapes d'installation et le guide Markdown complet pour ce 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.
Installation
Section intitulée « Installation »bun add @capgo/capacitor-widget-kitbunx cap syncImporter
Section intitulée « Importer »import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';Configuration iOS
Section intitulée « Configuration iOS »Pour les activités en direct et les extensions WidgetKit, configurez l'application native en premier :
- Utilisez iOS 17+ pour les boutons d'activité en direct interactifs lorsqu'il est possible.
- Ajouter
NSSupportsLiveActivitiesà l'applicationInfo.plistlors de l'utilisation d'ActivityKit. - Ajoutez le même groupe d'application à la cible de l'application et à la cible de l'extension de widget.
- Définir
CapgoWidgetKitAppGroupdans les deuxInfo.plistfichiers sur l'identifiant du groupe d'application partagé.
<key>CapgoWidgetKitAppGroup</key><string>group.app.capgo.widgetkit.exampleapp.widgetkit</string>Vérifier le support
Section intitulée « Vérifier le support »const { supported, reason } = await CapgoWidgetKit.areActivitiesSupported();
if (!supported) { console.log('WidgetKit bridge unavailable:', reason);}Option 1 : Modèle d'activité SVG
Section intitulée « Option 1 : Modèle d'activité SVG »Utilisez ce mode lorsque le widget peut afficher l'SVG résolu. Le plugin stocke l'état, résout les placeholders, applique les actions de tap, change les vignettes SVG et maintient l'état du chronomètre cohérent.
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>`, }, ], }, }, },});Exécuter les actions depuis l'application
Section intitulée « Exécuter les actions depuis l'application »Les widgets natifs peuvent déclencher les mêmes actions à travers leur hotspot/action. L'application peut également les exécuter directement :
await CapgoWidgetKit.performTemplateAction({ activityId: activity.activityId, actionId: 'toggle-rest', sourceId: 'app-pause-play-button',});Gérer les événements des widgets
Section intitulée “Gérer les événements des widgets”Les actions émettent des événements afin que l'application puisse traiter les interactions des widgets après le lancement ou la reprise :
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,});Mettre à jour ou terminer l'activité
Section intitulée “Mettre à jour ou terminer l'activité”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' },});Mutations de cadre
Section intitulée “Mutations de cadre”Les mutations de cadre écrivent l'ID du cadre actif dans l'état. Un layout peut ensuite le lire avec frameIdPath.
| Opération | Comportement |
|---|---|
set | Définir un identifiant de cadre spécifique. Les chaînes de caractères simples sont traitées comme des identifiants de cadre littéraux ; {{...}} les modèles sont résolus en premier. |
next | Passer au cadre suivant de frameIds ou les cadres déclarés sur surface. |
previous | Passer au cadre précédent. |
toggle | Alternner entre les deux premiers cadres disponibles, ou entre le cadre actuel et frameId. |
Les identifiants de cadre non valides sont ignorés lorsque la mutation a une liste de cadres sélectionnables connue, afin que l'état reste aligné avec la surface affichée.
Mutations de temporisation
Sous-section intitulée “Mutations de temporisation”Les mutations de temporisation visent un horloge nommée de definition.timers.
| Opération | Comportement |
|---|---|
start / restart | Commencez à zéro en utilisant la durée actuelle. |
pause | Enregistrez le temps écoulé et effacez startedAt. |
resume | Résumez uniquement les temporisations arrêtées. Les temporisations arrêtées restent arrêtées jusqu'à un démarrage explicite ou un redémarrage. |
toggle | Suspendez une temporisation en cours ou résumez une temporisation suspendue. |
reset | Effacez le temps écoulé et revenez à l'état d'inactivité. |
stop | Effacez les progrès de l'exécution et marquez la temporisation arrêtée. |
setDuration | Récalculez l'état après une modification de la durée. |
Les liaisons temporisées sont disponibles pour SVG comme {{timers.<id>.remainingText}}, {{timers.<id>.elapsedMs}}, {{timers.<id>.status}}, et les champs liés.
Option 2 : Session de widget natif intégrale
Utilisez ce mode lorsque l'interface utilisateur du widget est construite en __CAPGO_KEEP_0__. Le plugin donne à l'application et au widget un enregistrement de session partagé et une file d'attente de messages.Use this mode when the widget UI is built in native code. The plugin gives the app and widget a shared session record and a message queue.
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);Messages de widgets Async
Section intitulée « Messages de widgets Async »Les messages couvrent le travail qui nécessite une réponse ultérieure, comme un widget qui demande à l'application de synchroniser les données.
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 },});Pour échouer le travail, passez error au lieu de response:
await CapgoWidgetKit.completeWidgetMessage({ messageId: message.messageId, error: 'Network unavailable',});completeWidgetMessage Cela est idempotent. Si le message est déjà terminé ou échoué, les appels répétés retournent l'instance de message existante.
Arrêter une session Native
Section intitulée « Arrêter une session Native »await CapgoWidgetKit.stopWidgetSession({ widgetId: session.widgetId, state: { isRunning: false },});API Groupes
Section intitulée « API Groupes »| Groupe | APIs |
|---|---|
| Capacité | areActivitiesSupported, getPluginVersion |
| Cycle de vie de l'activité SVG | startTemplateActivity, updateTemplateActivity, endTemplateActivity, getTemplateActivity, listTemplateActivities |
| Actions et événements SVG | performTemplateAction, listTemplateEvents, acknowledgeTemplateEvents |
| Sessions de widgets natifs | startWidgetSession, updateWidgetSession, stopWidgetSession, getWidgetSession, listWidgetSessions |
| Messages de widgets natifs | sendWidgetMessage, listWidgetMessages, acknowledgeWidgetMessages, completeWidgetMessage |
Source De Vérité
Section intitulée « Source De Vérité »La référence de type complète se trouve dans le dépôt de plugin sur GitHub src/definitions.ts.