Vai alla sezione principale
Indietro ai plugin
@capgo/capacitor-kit di widget
Tutorial
da github.com/Cap-go

Kit di widget

Crea superfici WidgetKit e di attività in tempo reale da Capacitor con frame SVG, timer, hotspot di azione o sincronizzazione dello stato del widget nativo completo

Guida

Tutorial su Kit di Widget

Usando @capgo/capacitor-kit-di-widget

@capgo/capacitor-widget-kit consente a un'app Capacitor di gestire le esperienze di WidgetKit e di attività in tempo reale in due modi:

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

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 una definizione di template, il ponte nativo risolve i placeholder e i tocchi del widget possono modificare lo stato in seguito.

Sono buoni esempi i timer di allenamento, le carte di stato di consegna, i punteggi sportivi o qualsiasi interfaccia di utilizzo compatto in cui 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>`,
          },
        ],
      },
    },
  },
});

Gestisci Azioni Widget Nell'App

Gli azioni dei widget vengono persistite come eventi. Leggi e riconosci le azioni quando l'app si riavvia o dopo un passo 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

Usa sessioni full-native quando l'interfaccia utente del widget è meglio costruita direttamente in Swift, Kotlin o Java. Capacitor inizia e ferma 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 },
});

Inoltra Lavoro Asincrono Tra Widget E App

I messaggi possono fluire dall'app al widget o dal widget all'app. Rimangono 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, completa il messaggio con un errore:

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

Interrompi Sessioni Pulitamente

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

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

Note di Configurazione Nativa

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

Riferimento Completo