Mulai
Copy prompt pengaturan dengan langkah instalasi dan panduan markdown lengkap untuk plugin ini.
Set up this Capacitor plugin in the project.
Use the package manager already used by the project.
Install these package(s): `@capgo/capacitor-widget-kit`
Run the required Capacitor sync/update step after installation.
Read this markdown guide for the full setup steps: https://raw.githubusercontent.com/Cap-go/website/refs/heads/main/apps/docs/src/content/docs/docs/plugins/widget-kit/getting-started.mdx
Use that guide for platform-specific steps, native file edits, permissions, config changes, imports, and usage setup.
If that guide references other docs pages, read them too.
Pasang
Bagian berjudul “Pasang”bun add @capgo/capacitor-widget-kitbunx cap syncimport { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';Pengaturan iOS
Bab berjudul “Pengaturan iOS”Untuk Aktivitas Hidup dan ekstensi WidgetKit, konfigurasi aplikasi asli terlebih dahulu:
- Pilih iOS 17+ ketika memungkinkan untuk tombol Aktivitas Hidup interaktif.
- Tambahkan
NSSupportsLiveActivitieske aplikasiInfo.plistketika menggunakan ActivityKit. - Tambahkan grup aplikasi yang sama ke target aplikasi dan target ekstensi widget.
- Setel
CapgoWidgetKitAppGroupdi keduaInfo.plistfile ke identifikasi grup aplikasi yang dibagikan.
<key>CapgoWidgetKitAppGroup</key><string>group.app.capgo.widgetkit.exampleapp.widgetkit</string>Periksa Support
Bagian berjudul “Periksa Support”const { supported, reason } = await CapgoWidgetKit.areActivitiesSupported();
if (!supported) { console.log('WidgetKit bridge unavailable:', reason);}Pilihan 1: Template Aktivitas SVG
Bagian berjudul “Pilihan 1: Template Aktivitas SVG”Gunakan mode ini ketika widget dapat menampilkan SVG yang sudah terpecahkan. Plugin menyimpan state, menyelesaikan tempat-tempat pengganti, menerapkan aksi sentuh, mengganti frame SVG, dan menjaga kekonsistenan state timer.
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>`, }, ], }, }, },});Jalankan Aksi Dari Aplikasi
Bagian berjudul “Jalankan Aksi Dari Aplikasi”Widget native dapat memicu aksi yang sama melalui pengkabelan hotspot/aksi. Aplikasi juga dapat menjalankannya secara langsung:
await CapgoWidgetKit.performTemplateAction({ activityId: activity.activityId, actionId: 'toggle-rest', sourceId: 'app-pause-play-button',});Proses Event Widget
Judul Bagian “Proses Event Widget”Aksi mengirimkan event sehingga aplikasi dapat memproses interaksi widget setelah diluncurkan atau diresume:
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,});Perbarui atau Selesai Aktivitas
Judul Bagian “Perbarui atau Selesai Aktivitas”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' },});Mutasi Frame
Judul Bagian “Mutasi Frame”Mutasi frame menulis id frame aktif ke dalam state. Sebuah layout dapat membacanya dengan frameIdPath.
| Operasi | Sikap |
|---|---|
set | Atur ID frame tertentu. String-string biasa dianggap sebagai ID frame literal; {{...}} template-template diresolusi terlebih dahulu. |
next | Pindah ke frame berikutnya dari frameIds atau frame-frame yang dideklarasikan pada surface. |
previous | Pindah ke frame sebelumnya. |
toggle | Tampilkan frame-frame yang pertama dua frame yang tersedia, atau antara frame saat ini dan frameId. |
ID frame yang tidak valid diabaikan ketika mutasi memiliki daftar frame yang dapat dipilih, sehingga keadaan tetap sinkron dengan permukaan yang dirender.
Mutasi Timer
Judul bagian “Mutasi Timer”Mutasi timer mengarah ke timer bernama dari definition.timers.
| Operasi | Sikap |
|---|---|
start / restart | Mulai dari nol menggunakan durasi saat ini. |
pause | Simpan waktu yang telah berlalu dan hapus startedAt. |
resume | Tetapkan hanya timer yang terhenti. Timer yang berhenti akan tetap berhenti sampai dimulai atau diulang secara eksplisit. |
toggle | Tetapkan timer yang berjalan atau lanjutkan timer yang terhenti. |
reset | Hapus waktu yang telah berlalu dan kembali ke keadaan idle. |
stop | Hapus kemajuan waktu eksekusi dan tandai timer sebagai berhenti. |
setDuration | Rekomputasi status setelah perubahan durasi. |
Ikatan timer tersedia untuk SVG sebagai {{timers.<id>.remainingText}}, {{timers.<id>.elapsedMs}}, {{timers.<id>.status}}dan bidang terkait.
Pilihan 2: Sesi Widget Penuh-Native
Gunakan mode ini ketika antarmuka widget dibangun dalam native __CAPGO_KEEP_0__. Plugin memberikan aplikasi dan widget sebuah rekaman sesi bersama dan antrian pesan.Gunakan mode ini ketika antarmuka widget dibangun dalam native code. Plugin memberikan aplikasi dan widget sebuah rekaman sesi bersama dan antrian pesan.
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);Pesan Widget Synchronous
Judul Bagian “Pesan Widget Synchronous”Pesan yang menutupi pekerjaan yang memerlukan jawaban yang lebih lambat, seperti widget yang meminta aplikasi untuk sinkronisasi 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 },});Untuk gagal pekerjaan, pass error bukan response:
await CapgoWidgetKit.completeWidgetMessage({ messageId: message.messageId, error: 'Network unavailable',});completeWidgetMessage Tidak bergantung. Jika pesan sudah selesai atau gagal, panggilan yang diulang kembali mengembalikan snapshot pesan yang sudah ada.
Hentikan Sesi Native
Judul Bagian “Hentikan Sesi Native”await CapgoWidgetKit.stopWidgetSession({ widgetId: session.widgetId, state: { isRunning: false },});Grup API
Judul Bagian “API Groups”| Grup | API |
|---|---|
| Kemampuan | areActivitiesSupported, getPluginVersion |
| Aktivitas siklus SVG | startTemplateActivity, updateTemplateActivity, endTemplateActivity, getTemplateActivity, listTemplateActivities |
| Aksi dan event SVG | performTemplateAction, listTemplateEvents, acknowledgeTemplateEvents |
| Sesi widget native | startWidgetSession, updateWidgetSession, stopWidgetSession, getWidgetSession, listWidgetSessions |
| Pesan widget native | sendWidgetMessage, listWidgetMessages, acknowledgeWidgetMessages, completeWidgetMessage |
Sumber Kebenaran
Judul Bagian “Source Of Truth”Referensi jenis penuh hidup di repositori plugin di src/definitions.ts.