Passer au contenu principal
Retour aux plugins
@capgo/capacitor-kit-de-widgets
Tutorial
@capgo/capacitor-kit-de-widgets

Kit de widgets

Construirez des surfaces de WidgetKit et d'activités en direct à partir de Capacitor avec des cadres SVG, des temporisations, des zones d'action ou une synchronisation complète de l'état du widget natif

Démonstration

Démonstrations WebP animées

Contrôles de modèles de WidgetKit et d'activité en direct affichés comme une démonstration WebP animée.

Ressources source
Démonstration de WidgetKit animée montrant l'état et les contrôles du widget de modèle pilotés à partir de Capacitor
Flux de modèle de Widget

Guide

Tutoriel sur Widget Kit

En utilisant @capgo/capacitor-widget-kit

@capgo/capacitor-widget-kit permet à une application Capacitor de piloter les expériences de WidgetKit et d'activité en direct de deux manières :

  • Rendre des surfaces de modèle SVG résolu avec changement de cadre, zones de clic et compte à rebours/arrêt.
  • Conservez l'interface utilisateur native tout en partageant l'état de session JSON et les messages asynchrones entre l'application et le widget.

Installer

bun add @capgo/capacitor-widget-kit
bunx cap sync

Quand Utiliser les Modèles SVG

Utilisez les modèles SVG lorsque la surface du widget peut être décrite en SVG. L'application stocke une définition de modèle, le pont natif résout les placeholders et les appuis de widget peuvent muter l'état plus tard.

Les bonnes affaires comprennent les chronomètres d'entraînement, les cartes de statut de livraison, les scores de sports ou tout UI compact où le passage entre les cadres nommés est suffisant.

import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';

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

Gérer les actions du widget dans l'application

Les actions du widget sont persistées sous forme d'événements. Lisez et reconnaîtrez-les lorsque l'application reprend ou après une étape de synchronisation de fond.

const { events } = await CapgoWidgetKit.listTemplateEvents({
  activityId: activity.activityId,
  unacknowledgedOnly: true,
});

for (const event of events) {
  console.log(event.actionId, event.state, event.timers);
}

await CapgoWidgetKit.acknowledgeTemplateEvents({ activityId: activity.activityId });

Quand Utiliser les Sessions Native Complètes

Utilisez les sessions natives complètes lorsque l'interface utilisateur du widget est mieux construite directement en Swift, Kotlin ou Java. Capacitor démarre et arrête toujours la session, garde l'état partagé à jour et file le travail entre l'application et le widget code.

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

Filez le travail asynchrone entre le widget et l'application

Les messages peuvent passer de l'application au widget ou du widget à l'application. Ils restent en attente jusqu'à ce qu'ils soient reconnus et terminés.

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

Si l'opération échoue, terminez le message avec une erreur :

await CapgoWidgetKit.completeWidgetMessage({
  messageId: message.messageId,
  error: 'Sync failed',
});

Arrêtez les sessions de manière propre

await CapgoWidgetKit.endTemplateActivity({
  activityId: activity.activityId,
  state: { title: 'Workout complete', frame: 'summary' },
});

await CapgoWidgetKit.stopWidgetSession({
  widgetId: session.widgetId,
  state: { isRunning: false },
});

Notes de configuration native

Pour iOS WidgetKit et Live Activities, configurez un groupe d'application sur les cibles de l'application et de l'extension de widget, et définissez CapgoWidgetKitAppGroup dans les deux Info.plist fichiers. Les boutons interactifs nécessitent une extension de widget qui relie le pont natif fourni par le plugin et l'intention d'action.

Référence complète

Continuez à partir de l'utilisation de @capgo/capacitor-widget-kit

Si vous utilisez En utilisant @capgo/capacitor-widget-kit planer les travaux de plugin natif, connectez-le à @capgo/capacitor-kit de widgets pour les détails d'implémentation dans @capgo/capacitor-kit de widgets, Démarrage pour les détails d'implémentation dans Démarrage, Capgo Répertoire des plugins pour le flux de travail du produit dans Capgo Répertoire des plugins, Capacitor Plugins par Capgo pour les détails d'implémentation dans Capacitor Plugins par Capgo, et Ajouter ou Mettre à jour les plugins pour les détails d'implémentation dans Ajouter ou Mettre à jour les plugins.