Lompat ke konten

Mulai

GitHub

Kamu bisa menggunakan Setup Bantuan AI kami untuk menginstal plugin. Tambahkan Capgo kemampuan ke alat AI kamu menggunakan perintah berikut:

Tampilan Jendela Terminal
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

Lalu gunakan prompt berikut:

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

Jika Anda lebih suka Setup Manual, instal plugin dengan menjalankan perintah-perintah berikut dan ikuti instruksi spesifik platform di bawah ini:

Jendela Terminal
bun add @capgo/capacitor-widget-kit
bunx cap sync
import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';

Untuk Aktivitas Hidup dan Ekstensi WidgetKit, konfigurasi aplikasi native terlebih dahulu:

  • Pilih iOS 17+ untuk tombol Aktivitas Hidup interaktif ketika memungkinkan.
  • Tambah NSSupportsLiveActivities ke app Info.plist ketika menggunakan ActivityKit.
  • Tambahkan App Group yang sama ke target app dan target ekstensi widget.
  • Setel CapgoWidgetKitAppGroup di kedua Info.plist file ke identifikasi App Group yang bersamaan.
<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);
}

Gunakan mode ini ketika widget dapat mengrender SVG yang telah terpecahkan. Plugin menyimpan state, menyelesaikan tempat pengganti, menerapkan aksi sentuh, mengganti frame SVG, dan menjaga agar state timer tetap konsisten.

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

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

Aksi mengeluarkan event sehingga aplikasi dapat memproses interaksi widget setelah peluncuran atau resume:

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,
});
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 menulis id frame aktif ke dalam state. Sebuah layout dapat membacanya dengan frameIdPath.

OperasiTindakan
setAtur id frame tertentu. String sederhana dianggap sebagai id frame literal; {{...}} template diresolusi terlebih dahulu.
nextPindah ke frame berikutnya dari frameIds atau frame yang dideklarasikan pada surface.
previousPindah ke frame sebelumnya.
toggleTampilkan antara 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 mengarah ke timer bernama dari definition.timers.

OperasiTindakan
start / restartMulai dari nol menggunakan durasi saat ini.
pauseSimpan waktu yang telah berlalu dan hapus startedAt.
resumeMulai hanya timer yang terhenti. Timer yang berhenti tetap berhenti sampai dimulai atau diulang secara eksplisit.
togglePanggil waktu yang berjalan atau mulai waktu yang terhenti.
resetHapus waktu yang telah berlalu dan kembali ke idle.
stopHapus kemajuan waktu yang berjalan dan tandai timer sebagai berhenti.
setDurationPerbarui status setelah perubahan durasi.

Koneksi timer tersedia untuk SVG sebagai {{timers.<id>.remainingText}}, {{timers.<id>.elapsedMs}}, {{timers.<id>.status}}, dan bidang terkait.

Pilih mode ini ketika antarmuka widget dibangun dalam native code. Plugin ini memberikan aplikasi dan widget sebuah catatan 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 menangani pekerjaan yang memerlukan jawaban kemudian, 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 bukanlah response:

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

completeWidgetMessage adalah idempoten. Jika pesan sudah selesai atau gagal, panggilan ulang akan mengembalikan snapshot pesan yang ada.

await CapgoWidgetKit.stopWidgetSession({
widgetId: session.widgetId,
state: { isRunning: false },
});
KelompokAPI
KemampuanareActivitiesSupported, getPluginVersion
Aktivitas SVG siklus hidupstartTemplateActivity, updateTemplateActivity, endTemplateActivity, getTemplateActivity, listTemplateActivities
Aksi dan event SVGperformTemplateAction, listTemplateEvents, acknowledgeTemplateEvents
Sesi widget nativestartWidgetSession, updateWidgetSession, stopWidgetSession, getWidgetSession, listWidgetSessions
Pesan widget nativesendWidgetMessage, listWidgetMessages, acknowledgeWidgetMessages, completeWidgetMessage

Referensi jenis penuh hidup di repository plugin di src/definitions.ts.

Jika Anda menggunakan Getting Started untuk merencanakan pekerjaan plugin native, hubungkannya dengan Using @capgo/capacitor-widget-kit untuk kemampuan native dalam Menggunakan @capgo/capacitor-widget-kit, Capgo Direktori Plugin untuk alur kerja produk dalam Capgo Direktori Plugin, Capacitor Plugin oleh Capgo untuk detail implementasi dalam Capacitor Plugin oleh Capgo Menambahkan atau Mengupdate Plugin untuk detail implementasi dalam Menambahkan atau Mengupdate Plugin, dan Alternatif Plugin Enterprise Ionic untuk alur kerja produk dalam Alternatif Plugin Enterprise Ionic.