Zum Inhalt springen

Erste Schritte

GitHub

Du kannst unser KI-gestütztes Setup nutzen, um das Plugin zu installieren. Füge die Capgo Skills mit dem folgenden Befehl deinem KI-Tool hinzu:

Terminalfenster
bunx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

Nutze dann diesen Prompt:

Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/capacitor-widget-kit` plugin in my project.

Wenn du ein manuelles Setup bevorzugst, installiere das Plugin mit den folgenden Befehlen und befolge die plattformspezifischen Anweisungen unten:

Terminalfenster
bun add @capgo/capacitor-widget-kit
bunx cap sync
import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';
import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';
const result = await CapgoWidgetKit.areActivitiesSupported();
console.log(result);
import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';
const result = await CapgoWidgetKit.startTemplateActivity({
definition: {
id: 'id-123',
layouts: {},
},
state: {},
});
console.log(result);
import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';
const result = await CapgoWidgetKit.startTemplateWidget({
definition: {
id: 'id-123',
layouts: {},
},
state: {},
});
console.log(result);
  • Nativer Sync: ausführen bunx cap sync nach Plugin-Upgrades.
  • Single Source of Truth: Vertrauen src/definitions.ts im GitHub Repo.

Konfiguriere zuerst die native App für Live Activities und WidgetKit-Extensions:

  • Nutze nach Möglichkeit iOS 17+, um interaktive Live Activity-Buttons zu verwenden.
  • Füge NSSupportsLiveActivities zur App Info.plist bei der Verwendung von ActivityKit.
  • Füge derselben App Group sowohl das App-Target als auch das Widget-Extension-Target hinzu.
  • Setzen Sie CapgoWidgetKitAppGroup in beiden Info.plist Dateien zur gemeinsamen App Group Identifier.
<key>CapgoWidgetKitAppGroup</key>
<string>group.app.capgo.widgetkit.exampleapp.widgetkit</string>
const { supported, reason } = await CapgoWidgetKit.areActivitiesSupported();
if (!supported) {
console.log('WidgetKit bridge unavailable:', reason);
}

Nutze diesen Modus, wenn das Widget aufgelöste SVGs rendern kann. Das Plugin speichert den State, löst Platzhalter auf, führt Tap-Actions aus, wechselt SVG-Frames und hält den Timer-State konsistent.

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

Native Widgets können über ihre Hotspot/Action-Verknüpfung dieselben Aktionen auslösen. Die App kann diese auch direkt ausführen:

await CapgoWidgetKit.performTemplateAction({
activityId: activity.activityId,
actionId: 'toggle-rest',
sourceId: 'app-pause-play-button',
});

Aktionen emittieren Events, sodass die App Widget-Interaktionen nach dem Start oder dem Resume verarbeiten kann:

const { events } = await CapgoWidgetKit.listTemplateEvents({
activityId: activity.activityId,
unacknowledgedOnly: true,
});
for (const event of events) {
console.log('Widget event:', event.eventName, event.state, event.timers);
}
await CapgoWidgetKit.acknowledgeTemplateEvents({
activityId: activity.activityId,
});

Unter iOS können Widget-Extension-Buttons gebündelte LiveActivityIntent Helfer (CapgoTemplateActionIntent) aufrufen, die in dasselbe Event-Log schreiben. Dies ist unabhängig von Siri-Kurzbefehlen oder der Shortcuts App. Siehe Siri, Shortcuts und Widgets.

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

Frame-Mutationen schreiben die aktive Frame-ID in den State. Ein Layout kann diese dann mit lesen: frameIdPath.

OperationVerhalten
setEine spezifische Frame-ID setzen. Plain Strings werden als literale Frame-IDs behandelt; {{...}} Templates werden zuerst aufgelöst.
nextZum nächsten Frame wechseln von frameIds oder den auf ... deklarierten Frames surface.
previousZum vorherigen Frame wechseln.
toggleWechselt zwischen den ersten zwei verfügbaren Frames oder zwischen dem aktuellen Frame und frameId.

Ungültige Frame-IDs werden ignoriert, wenn die Mutation eine bekannte Liste auswählbarer Frames hat, damit der State mit der gerenderten Oberfläche synchron bleibt.

Timer-Mutationen zielen auf einen benannten Timer von definition.timers.

OperationVerhalten
start / restartMit der aktuellen Dauer bei Null starten.
pauseVergangene Zeit speichern und startedAt.
resumeNur pausierte Timer fortsetzen. Gestoppte Timer bleiben gestoppt, bis sie explizit gestartet oder neu gestartet werden.
togglePausiere einen laufenden Timer oder setze einen pausierten Timer fort.
resetClear elapsed time and return to idle.
stopLaufzeitfortschritt löschen und den Timer als gestoppt markieren.
setDurationStatus nach einer Änderung der Dauer neu berechnen.

Timer-Bindings stehen in SVG als zur Verfügung: {{timers.<id>.remainingText}}, {{timers.<id>.elapsedMs}}, {{timers.<id>.status}}, sowie zugehörige Felder.

Option 2: Vollständige Native Widget-Session

Abschnitt mit dem Titel „Option 2: Full-Native Widget Session“

Nutze diesen Modus, wenn das Widget-UI in nativem code gebaut wird. Das Plugin stellt der App und dem Widget eine gemeinsame Session-Record und eine Message Queue bereit.

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 },
});
const { sessions } = await CapgoWidgetKit.listWidgetSessions();
console.log('Known widget sessions:', sessions);

Messages cover work that needs a later response, such as a widget asking the app to sync data.

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

Um den Job fehlschlagen zu lassen, übergeben Sie error anstatt response:

await CapgoWidgetKit.completeWidgetMessage({
messageId: message.messageId,
error: 'Network unavailable',
});

completeWidgetMessage ist idempotent. Wenn die Nachricht bereits abgeschlossen oder fehlgeschlagen ist, liefern wiederholte Aufrufe den vorhandenen Message-Snapshot zurück.

await CapgoWidgetKit.stopWidgetSession({
widgetId: session.widgetId,
state: { isRunning: false },
});
GruppeAPIs
FunktionareActivitiesSupported, getPluginVersion
SVG-Lebenszyklus der AktivitätstartTemplateActivity, updateTemplateActivity, endTemplateActivity, getTemplateActivity, listTemplateActivities
SVG-Aktionen und EventsperformTemplateAction, listTemplateEvents, acknowledgeTemplateEvents
Native Widget-SessionsstartWidgetSession, updateWidgetSession, stopWidgetSession, getWidgetSession, listWidgetSessions
Native Widget-MessagessendWidgetMessage, listWidgetMessages, acknowledgeWidgetMessages, completeWidgetMessage

Die vollständige Typ-Referenz findest du im Plugin-Repository unter src/definitions.ts.

Wenn du es nutzt Erste Schritte Um die Arbeit an nativen Plugins zu planen, verbinde sie mit @capgo/capacitor-widget-kit verwenden für die native Funktion in „@capgo/capacitor-widget-kit verwenden“, Capgo Plugin-Verzeichnis für den Produkt-Workflow im Capgo Plugin-Verzeichnis, Capacitor Plugins von Capgo für das Implementierungsdetail in Capacitor Plugins von Capgo, Plugins hinzufügen oder aktualisieren für das Implementierungsdetail beim Hinzufügen oder Aktualisieren von Plugins, und Ionic Enterprise Plugin-Alternativen für den Produkt-Workflow bei den Ionic Enterprise Plugin-Alternativen.