Salta al contenuto principale
@capgo/capacitor-widget-kit UI e sistema Open source

Widget Kit Plugin Capacitor

Crea interfacce WidgetKit e Live Activity da Capacitor con frame SVG, timer, hotspot di azione o sincronizzazione nativa dello stato del widget

Installa

bun add @capgo/capacitor-widget-kit bunx cap sync
npm, pnpm o yarn
  • npm install @capgo/capacitor-widget-kit
  • pnpm add @capgo/capacitor-widget-kit
  • yarn add @capgo/capacitor-widget-kit

Demo

Demo Widget Kit

Controlli dei template per WidgetKit e Live Activity mostrati in una demo WebP animata.

Asset sorgente
Demo animata di WidgetKit: stato dei widget template e controlli gestiti da Capacitor
Flusso del template widget

Guida

Come usare Widget Kit in Capacitor

Utilizzo di @capgo/capacitor-widget-kit

@capgo/capacitor-widget-kit permette a un'app Capacitor di gestire WidgetKit e Live Activity in due modi:

  • Renderizza superfici template SVG con cambio frame, hotspot per il tap e timer play/pause.
  • Mantieni il widget totalmente nativo mentre l'app e il widget condividono lo stato della sessione JSON e messaggi async.

Installa

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

Quando usare i template SVG

Usa i template SVG quando la superficie del widget può essere descritta come SVG. L'app memorizza la definizione del template, il bridge nativo risolve i placeholder e i tap sul widget possono mutare lo stato in seguito.

Ideali per timer di allenamento, card per lo stato delle consegne, punteggi sportivi o qualsiasi UI compatta dove basta switchare tra frame nominati.

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 le Widget Actions nell'app

Le azioni dei widget vengono salvate come eventi. Leggili e confermali alla ripresa dell'app o dopo uno step 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 le sessioni Full-Native

Usa le sessioni full-native quando l'interfaccia del widget conviene costruirla direttamente in Swift, Kotlin o Java. Capacitor avvia e arresta comunque la sessione, mantiene aggiornato lo stato condiviso e mette in coda il 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 },
});

Accodare il lavoro asincrono tra widget e app

I messaggi possono fluire dall'app al widget o viceversa. Restano in sospeso finché non vengono confermati e completati.

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 job fallisce, completa il messaggio con un errore:

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

Arrestare le sessioni in modo pulito

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

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

Note sulla configurazione Native

Per iOS WidgetKit e Live Activities, configura un App Group sui target dell'app e dell'estensione del widget e imposta CapgoWidgetKitAppGroup in entrambi i Info.plist file. I pulsanti interattivi richiedono un'estensione del widget che colleghi il bridge nativo e l'action intent forniti dal plugin.

Riferimento completo

Continua da Usare @capgo/capacitor-widget-kit

Se stai usando Usare @capgo/capacitor-widget-kit per pianificare il lavoro sui plugin nativi, collegalo a @capgo/capacitor-widget-kit per i dettagli di implementazione in @capgo/capacitor-widget-kit, Per iniziare per i dettagli di implementazione nella guida introduttiva, Directory dei plugin di Capgo per il workflow del prodotto nella Capgo Plugin Directory, Plugin Capacitor di Capgo per i dettagli di implementazione in Plugin Capacitor di Capgo, e Aggiunta o aggiornamento dei plugin per i dettagli di implementazione in Aggiunta o aggiornamento dei plugin.

FAQ

FAQ sul plugin Widget Kit

Come installo il plugin Widget Kit in un'app Capacitor?

Esegui "bun add @capgo/capacitor-widget-kit" (o "npm install @capgo/capacitor-widget-kit"), poi esegui "bunx cap sync" in modo che i progetti iOS e Android includano il code nativo. Importalo da "@capgo/capacitor-widget-kit" nella tua app code.

@capgo/capacitor-widget-kit funziona con React, Vue e Angular?

Sì. Widget Kit è un pacchetto Capacitor, quindi funziona con qualsiasi web framework in esecuzione all'interno di Capacitor, inclusi Ionic, React, Vue, Angular, Svelte e JavaScript puro.

Quale versione di Capacitor supporta @capgo/capacitor-widget-kit?

I plugin Capgo seguono la major version di Capacitor: usa la major version del plugin che corrisponde alla tua major version di Capacitor (ad esempio plugin v8 con Capacitor 8). La tabella di compatibilità nel README di GitHub elenca le versioni mantenute.

@capgo/capacitor-widget-kit è free e open source?

Sì. Il codice sorgente di code è pubblico su GitHub all'indirizzo https://github.com/Cap-go/capacitor-widget-kit/ e il pacchetto è gratuito su npm. Bug report e pull request sono i benvenuti.

Posso aggiornare code che usa Widget Kit senza passare per la revisione dell'App Store?

Installare o aggiornare il plugin modifica il code nativo, quindi serve una nuova build per lo store. Dopo, le modifiche a JavaScript, HTML e CSS che chiamano il plugin possono essere rilasciate subito con le live updates di Capgo.

Pubblica modifiche a Widget Kit senza attendere la revisione dell'app

Una volta incluso il plugin nel tuo store build, Capgo invia le modifiche a JavaScript, HTML e CSS tramite live updates in pochi minuti.

Inizia con Capgo