Vai al contenuto principale
Torna ai plugin
@capgo/capacitor-widget-kit
Tutorial
@capgo/capacitor-widget-kit

Widget Kit

Costruisci superfici WidgetKit e Live Activity con Capacitor utilizzando frame SVG, timer, hotspot di azione o sincronizzazione dello stato widget nativo completo

Demo

Demonstrazioni animate WebP

Controlli del template WidgetKit e Live Activity mostrati come una demo WebP animata.

Risorse di origine
Demo animata WidgetKit che mostra lo stato e i controlli del widget di template guidati da Capacitor
Flusso di template del widget

Guida

Tutorial sul kit dei widget

Testa sul dispositivo

Scarica l'app Capgo, poi scansa il codice QR code.

Collegamento QR di anteprima del plugin del kit dei widget code

Utilizza @capgo/capacitor-kit-dei-widget

@capgo/capacitor-widget-kit fa il Capacitor app guidare le esperienze di WidgetKit e Live Activity in due modi:

  • Rendere superfici di template SVG risolte con il passaggio di frame, hotspot di tocco e timer di pausa/riavvio.
  • Tenere il widget completamente nativo mentre l'app e il widget condividono uno stato di sessione JSON e messaggi asincroni.

Installare

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

Quando Usare Template SVG

Usare i template SVG quando la superficie del widget può essere descritta come SVG. L'app memorizza una definizione di template, il ponte nativo risolve i placeholder e i tocchi del widget possono mutare lo stato in seguito.

Buoni adatti includono timer di allenamento, carte di stato di consegna, punteggi di sport o qualsiasi UI compatto dove il passaggio tra frame denominati è sufficiente.

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

Gestire Azioni del Widget Nell'App

Gli azioni del widget sono persistite come eventi. Leggi e riconosci quando l'app riprende o dopo un passaggio di sincronizzazione in background.

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

Quando Usare Sessioni Full-Native

Usare le sessioni full-native quando l'interfaccia utente del widget è meglio costruita direttamente in Swift, Kotlin o Java. Capacitor inizia e ferma comunque la sessione, mantiene lo stato condiviso aggiornato e invia lavoro tra app e 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 },
});

Incolonna il lavoro asincrono tra widget e app

I messaggi possono fluire dall'app a widget o widget a app. Restano in attesa di conferma e completamento.

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

Se il lavoro fallisce, completare il messaggio con un errore:

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

Stop Sessioni Pulite

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

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

Nota di configurazione per la nativa

Per iOS WidgetKit e Live Activities, configurare un gruppo di app sulle destinazioni dell'app e dell'estensione widget e impostare CapgoWidgetKitAppGroup in entrambi Info.plist i file. I pulsanti interattivi richiedono un'estensione widget che collega il ponte nativo fornito dal plugin e l'intento di azione.

Riferimento completo

Continua da Utilizzo di @capgo/capacitor-widget-kit

Se stai utilizzando Utilizzando @capgo/capacitor-widget-kit per pianificare il lavoro di plugin nativo, connettilo con @capgo/capacitor-widget-kit per i dettagli di implementazione in @capgo/capacitor-widget-kit, Avvio per i dettagli di implementazione in Avvio, Directory dei Plugin di Capgo per il workflow del prodotto in Directory dei Plugin di Capgo, e Plugins di Capacitor sviluppati da Capgo per i dettagli di implementazione in Plugins di Capacitor sviluppati da Capgo, e Aggiungere o Aggiornare Plugins For l'implementazione dei dettagli in Aggiungere o Aggiornare Plugin.