Mulai
Copy sebuah 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-live-activities`
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/live-activities/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.
Instalasi
Judul bagian “Instalasi”Anda dapat menggunakan Pengaturan Bantuan AI kami untuk menginstal plugin. Tambahkan Capgo kemampuan ke alat AI Anda menggunakan perintah berikut:
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-pluginsLalu gunakan prompt berikut:
Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/capacitor-live-activities` plugin in my project.Jika Anda lebih suka Pengaturan Manual, instal plugin dengan menjalankan perintah-perintah berikut dan ikuti instruksi spesifik platform di bawah ini:
bun add @capgo/capacitor-live-activitiesbunx cap syncPengaturan iOS
Judul Bagian “Pengaturan iOS”Menginstal dan sinkronisasi plugin tidak menciptakan antarmuka Live Activity native. ActivityKit memerlukan Ekstensi Widget yang mendaftarkan konfigurasi Live Activity sebelum startActivity dapat menampilkan apa pun.
Persyaratan
Judul Bagian “Persyaratan”- Gunakan iOS 16.1 atau lebih baru untuk target aplikasi dan target Ekstensi Widget.
- Lakukan tes pada perangkat iOS atau simulator yang kompatibel. Dynamic Island hanya muncul pada model perangkat yang didukung; perangkat lain menggunakan presentasi Layar Kunci.
- Tetapkan data statis dan dinamis ActivityKit di bawah batas 4 KB Apple.
1. Buat Ekstensi Widget
Judul Bagian “1. Buat Ekstensi Widget”Buka proyek iOS native:
bunx cap open iosLalu:
- Pilih File > Baru > Target.
- Tambahkan sebuah Pengembangan Widget.
- Aktifkan Termasuk Aktivitas Langsung.
- Matikan Termasuk Tujuan Konfigurasi kecuali aplikasi juga memerlukan widget yang dapat dikonfigurasi.
- Pastikan ekstensi yang dihasilkan diintegrasikan ke dalam target aplikasi utama.
Widget Extension harus mengandung sebuah ActivityConfiguration dan mendaftarkannya di WidgetBundle. Ia harus menyediakan setiap presentasi Aktivitas Hidup yang diperlukan:
- Lock Screen
- Dynamic Island yang diperluas
- Dynamic Island yang padat di bagian depan dan belakang
- Dynamic Island yang minimal
Menambahkan target saja tidak cukup. Aplikasi native atau plugin harus memanggil API request, update, dan end dari ActivityKit. Ekstensi harus mengandung SwiftUI code yang dapat menerjemahkan dan menampilkan yang sama ActivityAttributes dan status konten yang digunakan oleh panggilan-panggilan tersebut. Termasuk model Aktivitas Hidup yang dipisahkan di kedua target aplikasi utama dan Widget Extension. Template Aktivitas Hidup yang dihasilkan Xcode tidak secara otomatis menampilkan layout JSON yang dikirimkan ke plugin ini; ekstensi juga memerlukan renderer layout native yang kompatibel.
2. Aktivitas Hidup
Judul bagian “2. Aktivitas Hidup”Tambahkan kunci berikut ke target aplikasi utama: Info.plist:
<key>NSSupportsLiveActivities</key><true/>Jika proyek menghasilkan Info.plist, tambahkan Mendukung Aktivitas Langsung dengan nilai Boolean YES di bawah properti target iOS kustom utama aplikasi
3. Konfigurasi App Group untuk Gambar Bersama
Judul bagian “3. Konfigurasi App Group untuk Gambar Bersama”Grup Aplikasi hanya diperlukan ketika menggunakan saveImage, removeImage, listImages, atau cleanupImagesPlugin ini mendapatkan identifikasi Grup Aplikasi dari identifikasi bundle aplikasi utama menggunakan format ini:
group.<MAIN_APP_BUNDLE_ID>.liveactivitiesMisalnya, aplikasi dengan identifier paket com.example.delivery harus menggunakan:
group.com.example.delivery.liveactivitiesDalam Xcode, tambahkan kemampuan App Groups ke target aplikasi utama dan target Ekstensi Widget, lalu aktifkan identifikasi yang sama pada kedua target.
Ekstensi Aktivitas Langsung tidak dapat mengakses jaringan. Unduh gambar remote di aplikasi utama dan simpan mereka ke App Group bersama sebelum mengacu mereka dari Aktivitas Langsung. Untuk gambar yang dibundel, tambahkan juga Ekstensi Widget pada anggota target aset.
4. Konfigurasi Tautan dalam
Bagian berjudul “4. Konfigurasi Tautan dalam”Ketika menggunakan behavior.widgetUrl atau urutan timer tapUrlDaftarlah skema URL atau Universal Link di aplikasi utama. Untuk skema khusus seperti myapp://order/12345tambahkan skema di pengaturan Info > Jenis URL target aplikasi utama.
5. Opsional: Aktifkan Perbarui Server-Ditentukan
Judul bagian “5. Opsional: Aktifkan Perbarui Server-Ditentukan”Pemberitahuan Push tidak diperlukan untuk perbarui lokal yang diinisiasi oleh aplikasi. Untuk memulai, mengupdate, atau mengakhiri Aktivitas Langsung dari server:
- Tambahkan Pemberitahuan Push ke target aplikasi utama.
- Olehkan token pemberitahuan AktivitasKit dan kirim ke server.
- Kirim pemberitahuan AktivitasKit melalui APNs menggunakan
liveactivitytipe push. - Tambahkan
NSSupportsLiveActivitiesFrequentUpdateske aplikasi utamaInfo.plisthanya ketika kasus penggunaan memerlukan pembaruan push yang sering.
Token push ActivityKit berbeda dari token perangkat-notifikasi pengguna standar. Mengaktifkan kemampuan Push Notifications saja tidak cukup; pembaruan yang dikendalikan oleh server memerlukan pengelolaan token asli dan backend APNs.
Daftar Periksa Pengaturan Nativ
Judul bagian “Daftar Periksa Pengaturan Nativ”Sebelum memanggil startActivity, pastikan:
NSSupportsLiveActivitiesdapat diaktifkan pada target aplikasi utama.- Ekstensi Widget diintegrasikan dan mendaftarkan sebuah
ActivityConfiguration. - Implementasi ActivityKit natif dan Ekstensi Widget menggunakan token yang sama
ActivityAttributestype. - Aplikasi dan Target Ekstensi Widget dideploy ke iOS 16.1 atau lebih lanjut.
- Aktivitas Hidup diaktifkan untuk aplikasi di Pengaturan iOS.
- Kelompok Aplikasi yang sesuai diaktifkan pada kedua target ketika menggunakan gambar yang dibagikan.
- Situs web URL khusus yang digunakan oleh
widgetUrlatautapUrlterdaftar.
Import
Judul Bagian “Import”import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';Ringkasan API
Judul Bagian “Ringkasan API”areActivitiesSupported
Bagian berjudul “areActivitiesSupported”Periksa apakah Aktivitas Langsung mendukung perangkat ini. Memerlukan iOS 16.1+ dan dukungan perangkat.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { supported, reason } = await CapgoLiveActivities.areActivitiesSupported();if (supported) { console.log('Live Activities are supported!');} else { console.log('Not supported:', reason);}startActivity
Bagian berjudul “startActivity”Mulai Aktivitas Langsung baru dengan tata letak dan data yang ditentukan.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { activityId } = await CapgoLiveActivities.startActivity({ layout: { type: 'container', direction: 'horizontal', children: [ { type: 'text', content: 'Order #{{orderNumber}}', fontSize: 16, fontWeight: 'bold' }, { type: 'text', content: '{{status}}', fontSize: 14, color: '#666666' } ] }, dynamicIslandLayout: { expanded: { leading: { type: 'image', source: 'sfSymbol', value: 'box.truck' }, trailing: { type: 'text', content: '{{eta}}' }, center: { type: 'text', content: '{{status}}' }, bottom: { type: 'progress', value: 'progress' } }, compactLeading: { type: 'image', source: 'sfSymbol', value: 'box.truck' }, compactTrailing: { type: 'text', content: '{{eta}}' }, minimal: { type: 'image', source: 'sfSymbol', value: 'box.truck' } }, data: { orderNumber: '12345', status: 'On the way', eta: '10 min', progress: 0.6 }});console.log('Started activity:', activityId);updateActivity
Bagian berjudul “updateActivity”Perbarui Aktivitas Langsung yang ada dengan data baru.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.updateActivity({ activityId: 'abc123', data: { status: 'Arrived!', eta: 'Now', progress: 1.0 }, alertConfiguration: { title: 'Delivery Update', body: 'Your order has arrived!' }});endActivity
Bagian berjudul “endActivity”Akhir Aktivitas Langsung.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.endActivity({ activityId: 'abc123', data: { status: 'Delivered' }, dismissalPolicy: 'after', dismissAfter: Date.now() + 3600000 // 1 hour from now});getAllActivities
Bagian berjudul “getAllActivities”Dapatkan semua kegiatan yang sedang aktif secara langsung.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { activities } = await CapgoLiveActivities.getAllActivities();activities.forEach(activity => { console.log(`Activity ${activity.activityId}: ${activity.state}`);});saveImage
Bagian berjudul “saveImage”Simpan gambar ke kontainer App Group bersama untuk digunakan dalam kegiatan hidup. Gambar harus disimpan ke kontainer bersama untuk dapat diakses dari ekstensi widget.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { success, imageName } = await CapgoLiveActivities.saveImage({ imageData: 'base64EncodedImageData...', name: 'product-image', compressionQuality: 0.8});// Use in layout with: { type: 'image', source: 'saved', value: imageName }removeImage
Bagian berjudul “removeImage”Hapus gambar yang disimpan dari kontainer bersama.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { success } = await CapgoLiveActivities.removeImage({ name: 'product-image' });listImages
Bagian berjudul “listImages”Daftar semua gambar yang disimpan di kontainer bersama.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { images } = await CapgoLiveActivities.listImages();console.log('Saved images:', images);cleanupImages
Bagian berjudul “cleanupImages”Hapus semua gambar yang disimpan dari kontainer bersama.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.cleanupImages();startTimerSequence
Bagian berjudul “startTimerSequence”Mulai urutan timer untuk olahraga/sukan. Di iOS: Tampil di Aktivitas Langsung dan Dynamic Island Di Android: Tampil sebagai peringatan latar depan dengan timer
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { sequenceId } = await CapgoLiveActivities.startTimerSequence({ title: 'HIIT Workout', steps: [ { duration: 30, title: 'Jumping Jacks', subtitle: 'Warm up', color: '#FF6B00', icon: 'figure.jumprope' }, { duration: 10, title: 'Rest', color: '#00C853', icon: 'pause.circle' }, { duration: 45, title: 'Burpees', subtitle: 'High intensity', color: '#FF0000', icon: 'flame.fill' }, { duration: 15, title: 'Rest', color: '#00C853', icon: 'pause.circle' }, { duration: 45, title: 'Mountain Climbers', color: '#FF0000', icon: 'figure.run' }, { duration: 15, title: 'Rest', color: '#00C853', icon: 'pause.circle' }, ], loop: true, loopCount: 3, soundEnabled: true, vibrateEnabled: true, countdownBeeps: true, tapUrl: 'myapp://workout/hiit'});pauseTimerSequence
Bagian berjudul “pauseTimerSequence”Tangguhkan urutan timer.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.pauseTimerSequence({ sequenceId: 'abc123' });resumeTimerSequence
Bagian berjudul “resumeTimerSequence”Tetapkan kembali urutan timer yang tertangguhkan.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.resumeTimerSequence({ sequenceId: 'abc123' });stopTimerSequence
Bagian berjudul “stopTimerSequence”Hentikan dan tutup urutan timer.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.stopTimerSequence({ sequenceId: 'abc123' });skipTimerStep
Bagian berjudul “skipTimerStep”Lewati ke langkah berikutnya dalam urutan.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.skipTimerStep({ sequenceId: 'abc123' });previousTimerStep
Bagian berjudul “previousTimerStep”Kembali ke langkah sebelumnya dalam urutan.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.previousTimerStep({ sequenceId: 'abc123' });getTimerState
Bagian berjudul “getTimerState”Dapatkan keadaan saat ini dari urutan timer.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const state = await CapgoLiveActivities.getTimerState({ sequenceId: 'abc123' });console.log(`Step ${state.currentStepIndex + 1}/${state.totalSteps}: ${state.currentStep.title}`);console.log(`Time remaining: ${state.remainingSeconds}s`);Referensi Tipe
Referensi TipeAreActivitiesSupportedResult
Referensi Tipe "Aktivitas yang Dapat Dibantu"Hasil Pengecekan Aktivitas yang Dapat Dibantu.
export interface AreActivitiesSupportedResult { /** Whether Live Activities are supported on this device */ supported: boolean; /** Reason if not supported */ reason?: string;}StartActivityOptions
Referensi Tipe "Pilihan Mulai Aktivitas"Pilihan untuk Mulai Aktivitas yang Berlangsung.
export interface StartActivityOptions { /** Main activity layout (lock screen widget) */ layout: ActivityLayout; /** Dynamic Island layout configuration */ dynamicIslandLayout: DynamicIslandLayout; /** Activity behavior settings */ behavior?: LiveActivitiesBehavior; /** Dynamic data for the activity */ data: Record<string, unknown>; /** Stale date timestamp (activity becomes stale after this) */ staleDate?: number; /** Relevance score for activity ordering (0-100) */ relevanceScore?: number;}StartActivityResult
Referensi Tipe "Hasil Mulai Aktivitas"Hasil Mulai Aktivitas.
export interface StartActivityResult { /** Unique activity identifier */ activityId: string;}UpdateActivityOptions
Referensi Tipe "Pilihan Perbarui Aktivitas"Pilihan untuk memperbarui Aktivitas Langsung.
export interface UpdateActivityOptions { /** Activity ID to update */ activityId: string; /** Updated data */ data: Record<string, unknown>; /** Optional alert to show with update */ alertConfiguration?: ActivityAlertConfiguration; /** Updated stale date */ staleDate?: number; /** Updated relevance score */ relevanceScore?: number;}EndActivityOptions
Bagian berjudul “EndActivityOptions”Pilihan untuk mengakhiri Aktivitas Langsung.
export interface EndActivityOptions { /** Activity ID to end */ activityId: string; /** Final data to display */ data?: Record<string, unknown>; /** Dismissal policy */ dismissalPolicy?: 'immediate' | 'default' | 'after'; /** Dismiss after timestamp (when dismissalPolicy is 'after') */ dismissAfter?: number;}GetAllActivitiesResult
Bagian berjudul “GetAllActivitiesResult”Hasil dari getAllActivities.
export interface GetAllActivitiesResult { /** List of activities */ activities: ActivityInfo[];}SaveImageOptions
Bagian berjudul “SaveImageOptions”Pilihan untuk menyimpan gambar.
export interface SaveImageOptions { /** Base64 encoded image data */ imageData: string; /** Name to save the image as */ name: string; /** JPEG compression quality (0-1, default 0.8) */ compressionQuality?: number;}SaveImageResult
Bagian berjudul “SaveImageResult”Hasil menyimpan sebuah gambar.
export interface SaveImageResult { /** Whether the save was successful */ success: boolean; /** Saved image name */ imageName: string;}RemoveImageOptions
Bagian berjudul “RemoveImageOptions”Opsi untuk menghapus sebuah gambar.
export interface RemoveImageOptions { /** Name of the image to remove */ name: string;}RemoveImageResult
Bagian berjudul “RemoveImageResult”Hasil menghapus sebuah gambar.
export interface RemoveImageResult { /** Whether the removal was successful */ success: boolean;}ListImagesResult
Bagian berjudul “ListImagesResult”Hasil menampilkan daftar gambar.
export interface ListImagesResult { /** List of saved image names */ images: string[];}TimerSequenceOptions
Bagian berjudul “TimerSequenceOptions”Pilihan untuk memulai urutan timer.
export interface TimerSequenceOptions { /** Array of steps in the sequence */ steps: TimerStep[]; /** Overall title for the sequence (e.g., "HIIT Workout", "Tabata") */ title?: string; /** Whether to loop the sequence when complete */ loop?: boolean; /** Number of times to loop (if loop is true, 0 means infinite) */ loopCount?: number; /** Play sound on step change (default: true) */ soundEnabled?: boolean; /** Vibrate on step change (default: true) */ vibrateEnabled?: boolean; /** Play countdown beeps in last 3 seconds (default: true) */ countdownBeeps?: boolean; /** Deep link URL when tapping the notification/activity */ tapUrl?: string; /** Keep screen on during timer (Android only, default: false) */ keepScreenOn?: boolean;}Sumber Kebenaran
Bagian berjudul “Sumber Kebenaran”Halaman ini dibuat dari plugin’s src/definitions.tsRe-run sinkronisasi ketika publik API berubah di atas.
Lanjutkan dari Getting Started
Bagian berjudul “Lanjutkan dari Getting Started”Jika Anda menggunakan Getting Started untuk merencanakan dashboard dan API operasi, hubungkannya dengan Menggunakan @capgo/capacitor-live-activities untuk kemampuan asli di Menggunakan @capgo/capacitor-live-activities, Ringkasan API untuk detail implementasi di Ringkasan API, Pendahuluan untuk detail implementasi di Pendahuluan, Kunci API untuk detail implementasi di Kunci API, dan Perangkat untuk detail implementasi di Perangkat.