Lompat ke konten utama
Kembali ke plugin
@capgo/capacitor-widget-kit
Tutorial
@capgo/capacitor-widget-kit

Widget Kit

Membangun permukaan WidgetKit dan Aktivitas Hidup dari Capacitor dengan kerangka SVG, timer, hotspot aksi, atau sinkronisasi widget penuh-native

Demo

Demo WebP animasi

Kontrol template WidgetKit dan Aktivitas Hidup ditampilkan sebagai demo WebP animasi.

Sumber aset
Demo WidgetKit animasi menampilkan keadaan widget template dan kontrol yang dikendalikan dari Capacitor
Aliran template widget

Petunjuk

Tutorial Kit Widget

Menguji pada perangkat

Unduh aplikasi Capgo, kemudian scan kode QR code.

Menggunakan @code/__CAPGO_KEEP_1__-kit-widget

Menggunakan @capgo/capacitor-widget-kit

@capgo/capacitor-widget-kit biarkan sebuah Capacitor aplikasi mengemudikan pengalaman WidgetKit dan Live Activity dalam dua cara:

  • Tampilkan permukaan template SVG yang telah diresolusi dengan mengganti frame, hotspot sentuh, dan timer pause/play.
  • Tetapkan widget sepenuhnya native sementara aplikasi dan widget berbagi status sesi JSON dan pesan async.

Install

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

Kapan Menggunakan Template SVG

Gunakan template SVG ketika permukaan widget dapat dijelaskan sebagai SVG. Aplikasi menyimpan definisi template, jembatan native memecahkan tempat penempatan, dan sentuhan widget dapat mengubah status kemudian.

Pilihan yang tepat termasuk timer olahraga, kartu status pengiriman, skor olahraga, atau antarmuka UI kompak mana pun di mana mengganti antara frame yang dinamai cukup.

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

Tangani Aksi Widget Di Aplikasi

Aksi widget disimpan sebagai event. Baca dan akui mereka ketika aplikasi kembali atau setelah langkah sinkronisasi latar belakang.

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 Sesi Full-Native

Gunakan sesi full-native ketika UI widget lebih baik dibangun secara langsung di Swift, Kotlin, atau Java. Capacitor masih memulai dan menghentikan sesi, menjaga status bersama terkini, dan mengantre 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 },
});

Antre Pekerjaan Async Antara Widget Dan Aplikasi

Pesan dapat mengalir dari aplikasi ke widget atau widget ke aplikasi. Mereka tetap menunggu konfirmasi 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 pekerjaan gagal, lengkapi pesan dengan kesalahan:

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

Hentikan Sesi Bersih

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

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

Catatan Pengaturan Nativ

Untuk WidgetKit iOS dan Aktivitas Hidup, konfigurasi sebuah Kelompok Aplikasi pada target aplikasi dan ekstensi widget, dan atur CapgoWidgetKitAppGroup di kedua Info.plist file. Tombol interaktif memerlukan ekstensi widget yang menghubungkan jembatan native yang disediakan plugin dan niat aksi.

Referensi Lengkap

Teruskan dari Menggunakan @capgo/capacitor-widget-kit

Jika Anda menggunakan Menggunakan @capgo/capacitor-widget-kit untuk merencanakan pekerjaan plugin native, hubungkannya dengan @capgo/capacitor-widget-kit untuk detail implementasi di @capgo/capacitor-widget-kit, Mengawali untuk detail implementasi di Mengawali, Direktori Plugin Capgo untuk alur kerja produk di Direktori Plugin Capgo, dan Plugin-Plugin Capacitor oleh Capgo untuk detail implementasi di Plugin-Plugin Capacitor oleh Capgo, serta Menambahkan atau Mengupdate Plugin untuk detail implementasi di Menambahkan atau Mengupdate Plugin.