Langsung ke konten utama
@capgo/capacitor-widget-kit UI & Sistem Open source

Widget Kit plugin Capacitor

Build permukaan WidgetKit dan Live Activity dari Capacitor dengan SVG frames, timer, action hotspots, atau sinkronisasi state widget full-native

Instal

bun add @capgo/capacitor-widget-kit bunx cap sync
npm, pnpm atau yarn
  • npm install @capgo/capacitor-widget-kit
  • pnpm add @capgo/capacitor-widget-kit
  • yarn add @capgo/capacitor-widget-kit

Demo

Demo Widget Kit

Kontrol template WidgetKit dan Live Activity ditampilkan dalam demo WebP animasi.

Aset sumber
Demo WidgetKit animasi yang menunjukkan state widget dan kontrol dari Capacitor
Alur template widget

Panduan

Cara menggunakan Widget Kit di Capacitor

Menggunakan @capgo/capacitor-widget-kit

@capgo/capacitor-widget-kit memungkinkan aplikasi Capacitor menjalankan pengalaman WidgetKit dan Live Activity dalam dua cara:

  • Render surface template SVG yang sudah di-resolve dengan pergantian frame, hotspot tap, dan timer pause/play.
  • Menjaga widget tetap sepenuhnya native saat aplikasi dan widget berbagi state sesi JSON dan pesan async.

Instal

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

Kapan Menggunakan Template SVG

Gunakan template SVG saat surface widget dapat dideskripsikan sebagai SVG. Aplikasi menyimpan definisi template, native bridge me-resolve placeholder, dan tap widget dapat mengubah state nanti.

Cocok untuk timer workout, kartu status pengiriman, skor olahraga, atau UI ringkas apa pun yang cukup dengan berpindah antar frame bernama.

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

Menangani Widget Actions di App

Aksi widget disimpan sebagai event. Baca dan konfirmasi event tersebut saat aplikasi kembali berjalan atau setelah proses background sync.

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

Kapan Menggunakan Full-Native Sessions

Gunakan sesi full-native jika UI widget lebih baik dibuat langsung menggunakan Swift, Kotlin, atau Java. Capacitor tetap akan memulai dan menghentikan sesi, menjaga state tetap sinkron, serta mengantrekan pekerjaan antara aplikasi dan 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 },
});

Antrekan Async Work Antara Widget dan App

Pesan dapat mengalir dari aplikasi ke widget atau sebaliknya. Pesan akan tetap berstatus pending sampai dikonfirmasi dan selesai.

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

Jika job gagal, selesaikan pesan dengan error:

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

Hentikan Sesi dengan Bersih

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

await CapgoWidgetKit.stopWidgetSession({
  widgetId: session.widgetId,
  state: { isRunning: false },
});

Catatan Setup Native

Untuk iOS WidgetKit dan Live Activities, konfigurasi App Group pada target aplikasi dan widget extension, lalu atur CapgoWidgetKitAppGroup di keduanya Info.plist file. Tombol interaktif memerlukan widget extension yang menghubungkan native bridge dan action intent yang disediakan plugin.

Referensi Lengkap

Lanjutkan dari Menggunakan @capgo/capacitor-widget-kit

Jika Anda menggunakan Menggunakan @capgo/capacitor-widget-kit untuk merencanakan pekerjaan plugin native, hubungkan dengan @capgo/capacitor-widget-kit untuk detail implementasi di @capgo/capacitor-widget-kit, Panduan Memulai untuk detail implementasi di Getting Started, Direktori Plugin Capgo untuk alur kerja produk di Direktori Plugin Capgo, Plugin Capacitor oleh Capgo untuk detail implementasi di Plugin Capacitor oleh Capgo, dan Menambahkan atau Memperbarui Plugin untuk detail implementasi di bagian Menambahkan atau Memperbarui Plugin.

FAQ

FAQ plugin Widget Kit

Bagaimana cara install plugin Widget Kit di aplikasi Capacitor?

Jalankan &quot;bun add @capgo/capacitor-widget-kit&quot; (atau &quot;npm install @capgo/capacitor-widget-kit&quot;), lalu jalankan &quot;bunx cap sync&quot; agar proyek iOS dan Android mendeteksi code native. Import dari &quot;@capgo/capacitor-widget-kit&quot; di dalam code aplikasi Anda.

Apakah @capgo/capacitor-widget-kit mendukung React, Vue, dan Angular?

Ya. Widget Kit adalah package Capacitor, jadi bisa digunakan dengan framework web apa pun yang berjalan di dalam Capacitor, termasuk Ionic, React, Vue, Angular, Svelte, dan JavaScript murni.

Versi Capacitor mana yang didukung oleh @capgo/capacitor-widget-kit?

Plugin Capgo mengikuti versi mayor Capacitor: gunakan versi mayor plugin yang sesuai dengan versi mayor Capacitor Anda (contoh: plugin v8 dengan Capacitor 8). Tabel kompatibilitas di README GitHub mencantumkan versi yang masih di-maintain.

Apakah @capgo/capacitor-widget-kit gratis dan open source?

Ya. Source code tersedia secara publik di GitHub pada https://github.com/Cap-go/capacitor-widget-kit/ dan paketnya gratis diinstal via npm. Bug report dan pull request sangat kami terima.

Bisakah saya update code yang menggunakan Widget Kit tanpa review App Store?

Instalasi atau upgrade plugin akan mengubah native code, jadi butuh build store baru. Setelah itu, perubahan JavaScript, HTML, dan CSS yang memanggil plugin bisa langsung dikirim lewat live updates Capgo.

Rilis perubahan Widget Kit tanpa menunggu review aplikasi

Setelah plugin ada di build store Anda, live updates Capgo akan mengirim perubahan JavaScript, HTML, dan CSS ke pengguna dalam hitungan menit.

Mulai dengan Capgo