Saltare al contenuto principale
Torna ai plugin
@capgo/capacitor-kit-di-widget
Istruzioni
@capgo/capacitor-kit-di-widget

Kit di widget

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

Demo

Demos WebP animate

I controlli del template WidgetKit e dell'attività in tempo reale mostrati come demo WebP animata.

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

Guida

Guida al Kit dei Widget

Testa sul dispositivo

Scarica l'app Capgo, poi scansione il QR code.

Collegamento QR di anteprima del plugin Kit dei Widget code

Utilizza @capgo/capacitor-kit-dei-widget

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

  • Rende disponibili superfici di template SVG risolte con il passaggio di frame, hotspot di tocco e timer di pausa/riavvio.
  • Conserva il widget completamente nativo mentre l'app e il widget condividono lo stato della sessione JSON e i messaggi asincroni.

Installa

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

Sfoglia quando utilizzare i template SVG

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

Buoni esempi includono timer di allenamento, carte dello stato di consegna, punteggi sportivi o qualsiasi interfaccia utente compatto dove cambiare 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 del widget nell'app

Gli azioni del widget sono persistite come eventi. Leggi e riconosci quando l'app riprende 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 });

Sfoglia quando utilizzare le sessioni full-native

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

Coda il lavoro asincrono tra widget e app

I messaggi possono fluire dall'app al widget o dal widget all'app. Restano in attesa di essere riconosciuti 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 lavoro fallisce, completa il messaggio con un errore:

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

Termina 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 di Configurazione Nativa

Per iOS WidgetKit e Attività in Tempo Reale, configura un Gruppo di Applicazione sulle destinazioni dell'app e dell'estensione widget e impostalo 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 Utilizzo di @capgo/capacitor-widget-kit per pianificare il lavoro di plugin nativo, connettilo con @capgo/capacitor-kit-di-widget per i dettagli di implementazione in @capgo/capacitor-kit-di-widget Iniziare per i dettagli di implementazione in Iniziare Directory dei Plugin di Capgo per il flusso di lavoro del prodotto in Directory dei Plugin di Capgo Plugin di Capacitor sviluppati da Capgo per i dettagli di implementazione in Plugin di Capacitor sviluppati da Capgo, e Aggiungere o Aggiornare Plugin per i dettagli di implementazione in Aggiungere o Aggiornare Plugin.