Lompat ke konten

Mulai

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 asli terlebih dahulu:

  • Pilih iOS 17+ ketika memungkinkan untuk tombol Aktivitas Hidup interaktif.
  • Tambahkan NSSupportsLiveActivities ke aplikasi Info.plist ketika menggunakan ActivityKit.
  • Tambahkan grup aplikasi yang sama ke target aplikasi dan target ekstensi widget.
  • Setel CapgoWidgetKitAppGroup di kedua Info.plist file ke identifikasi grup aplikasi yang dibagikan.
<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 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>`,
},
],
},
},
},
});

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

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

OperasiSikap
start / restartMulai dari nol menggunakan durasi saat ini.
pauseSimpan waktu yang telah berlalu dan hapus startedAt.
resumeTetapkan hanya timer yang terhenti. Timer yang berhenti akan tetap berhenti sampai dimulai atau diulang secara eksplisit.
toggleTetapkan timer yang berjalan atau lanjutkan timer yang terhenti.
resetHapus waktu yang telah berlalu dan kembali ke keadaan idle.
stopHapus kemajuan waktu eksekusi dan tandai timer sebagai berhenti.
setDurationRekomputasi status setelah perubahan durasi.

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

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 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.

await CapgoWidgetKit.stopWidgetSession({
widgetId: session.widgetId,
state: { isRunning: false },
});
GrupAPI
KemampuanareActivitiesSupported, getPluginVersion
Aktivitas siklus SVGstartTemplateActivity, 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 repositori plugin di src/definitions.ts.