Inizia
Copia un prompt di configurazione con le istruzioni di installazione e la guida markdown completa per questo plugin.
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.
Installazione
Sezione intitolata “Installazione”Puoi utilizzare la nostra configurazione assistita da AI per installare il plugin. Aggiungi le Capgo competenze al tuo strumento di AI utilizzando il seguente comando:
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-pluginsPoi utilizza il seguente prompt:
Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/capacitor-live-activities` plugin in my project.Se preferisci la configurazione manuale, installa il plugin eseguendo i seguenti comandi e segui le istruzioni specifiche per la piattaforma riportate di seguito:
bun add @capgo/capacitor-live-activitiesbunx cap syncConfigurazione per iOS
Sezione intitolata “Configurazione iOS”Il caricamento e sincronizzazione del plugin non creano l'interfaccia nativa dell'attività in tempo reale. ActivityKit richiede un'estensione del widget che registra una configurazione dell'attività in tempo reale prima di poter visualizzare qualcosa. startActivity Requisiti
Sezione intitolata “Requisiti”
Utilizza iOS 16.1 o una versione successiva sia per il target dell'app che per l'estensione del widget.- Esegui i test su un dispositivo iOS o un simulatore compatibile. L'isola dinamica si visualizza solo su modelli di dispositivi supportati; gli altri dispositivi utilizzano la presentazione della schermata di blocco.
- Assicurati di mantenere i dati statici e dinamici di ActivityKit sotto il limite di 4 KB stabilito da Apple.
- 1. Crea un'estensione del widget
Sezione intitolata “1. Crea un'estensione del widget”
Apre il progetto iOS nativo:Finestra della console
bunx cap open iosPoi:
- Seleziona File > Nuovo > Target.
- Aggiungi un Estensione del widget.
- Abilita Includi attività in tempo reale.
- Disabilita Includi intento di configurazione a meno che l'app non richieda anche un widget configurabile.
- Assicurati che l'estensione generata sia inclusa nel target dell'app principale.
La Widget Extension deve contenere un ActivityConfiguration e registrarlo nel suo WidgetBundle. Deve fornire ogni presentazione di attività in tempo reale richiesta:
- L'area di blocco schermo
- L'isola dinamica espansa
- L'isola dinamica compatta con testo in alto e in basso
- L'isola dinamica minima
Aggiungere solo il bersaglio non è sufficiente. L'app nativa o il plugin devono chiamare le API di richiesta, aggiornamento e fine di ActivityKit. L'estensione deve contenere SwiftUI code che possono decodificare e rendere lo stesso ActivityAttributes e stato di contenuto utilizzato da queste chiamate. Includere modelli condivisi di ActivityKit in entrambi i target dell'app principale e dell'estensione Widget. Il modello di attività in tempo reale generato da Xcode non rende automaticamente le layout JSON passate a questo plugin; l'estensione ha anche bisogno di un renderer di layout nativo compatibile.
2. Abilita le attività in tempo reale
Sottosezione intitolata “2. Abilita le attività in tempo reale”Aggiungi la seguente chiave al target dell'app principale' Info.plist:
<key>NSSupportsLiveActivities</key><true/>Se il progetto genera i suoi Info.plist, aggiungi Sostiene le attività in tempo reale con un valore booleano di YES sotto le proprietà del target iOS personalizzato del main app target al posto
Sottosezione intitolata “3. Configura il gruppo di applicazioni per le immagini condivise”
Un gruppo di applicazioni è richiesto solo quando si utilizza, o saveImage, removeImage, listImages. Il plugin deriva l'identificatore del gruppo di applicazioni dal bundle identifier del main app utilizzando questo formato esatto: cleanupImagesCopia nel portapenne
group.<MAIN_APP_BUNDLE_ID>.liveactivitiesEsempio, un'applicazione con identificatore di bundle com.example.delivery deve utilizzare:
group.com.example.delivery.liveactivitiesIn Xcode, aggiungi la Gruppi dell'applicazione capacità a entrambi il target dell'applicazione principale e il target dell'estensione Widget, quindi abilita lo stesso identificatore su entrambi i target.
Gli estensioni di attività in tempo reale non possono accedere a rete. Scarica le immagini remote nell'applicazione principale e salvali nel Gruppo App condiviso prima di riferirsi a esse da un'attività in tempo reale. Per le immagini incorporate, abilita anche l'estensione Widget nella partecipazione di target dell'asset.
4. Configura i collegamenti profondi
Sottosezione intitolata “4. Configura i collegamenti profondi”Quando si utilizza behavior.widgetUrl o una sequenza di timer tapUrl, registrare lo schema di URL corrispondente o il collegamento universale nell'applicazione principale. Per uno schema personalizzato come myapp://order/12345aggiungere lo schema sotto la destinazione principale dell'app Info > Tipi di URL impostazioni.
5. Facoltativo: Attivare gli aggiornamenti server-driven
Sottosezione intitolata “5. Facoltativo: Attivare gli aggiornamenti server-driven”Gli avvisi push non sono necessari per gli aggiornamenti locali iniziali dall'app. Per iniziare, aggiornare o terminare le attività in tempo reale da un server:
- Aggiungere la abilità di avvisi push alla destinazione principale dell'app. Ottenere i token di avvisi di ActivityKit e inviarli al server.
- Inviare le notifiche di ActivityKit attraverso APNs utilizzando il
- tipo di avviso.
liveactivity5. Facoltativo: Attivare gli aggiornamenti server-driven - Aggiungi
NSSupportsLiveActivitiesFrequentUpdatesalla app principaleInfo.plistsolo quando il caso d'uso richiede aggiornamenti di push frequenti.
I token di aggiornamento push di ActivityKit sono separati dai token di notifica standard per dispositivo dell'utente. Abilitare la capacità delle Notifiche Push da solo non è sufficiente; gli aggiornamenti server-driven richiedono un trattamento di token nativo e un backend APNs.
Elenco di controllo di configurazione nativa
Sezione intitolata “Elenco di controllo di configurazione nativa”Prima di chiamare startActivity, verificare che:
NSSupportsLiveActivitiessia abilitato sul target dell'app principale.- L'estensione del Widget è incorporata e registra un
ActivityConfiguration. - L'implementazione nativa di ActivityKit e l'estensione del Widget utilizzano lo stesso
ActivityAttributestipo. - L'app e l'estensione Widget sono distribuite su iOS 16.1 o successivo.
- I Live Activities sono abilitati per l'app nelle impostazioni iOS.
- Il gruppo di applicazioni corrispondente è abilitato su entrambi i target quando si utilizzano immagini condivise.
- Qualsiasi schema di URL personalizzato utilizzato da
widgetUrlotapUrlOppure
è registrato.
Importaimport { CapgoLiveActivities } from '@capgo/capacitor-live-activities';API Overview
API OverviewareActivitiesSupported
Sezione intitolata “__CAPGO_KEEP_0__ Overview”Verifica se le attività in tempo reale sono supportate su questo dispositivo. Richiede iOS 16.1+ e supporto del dispositivo.
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
Sottosezione intitolata “startActivity”Inizia una nuova attività in tempo reale con il layout specificato e i dati.
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
Sottosezione intitolata “updateActivity”Aggiorna un'attività in tempo reale esistente con nuovi dati.
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
Sottosezione intitolata “endActivity”Termina un'attività in tempo reale.
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
Sottosezione intitolata “getAllActivities”Ottieni tutte le attività in tempo reale attualmente attive.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { activities } = await CapgoLiveActivities.getAllActivities();activities.forEach(activity => { console.log(`Activity ${activity.activityId}: ${activity.state}`);});saveImage
Sezione intitolata “salva immagine”Salva un'immagine nel contenitore di gruppo condiviso per utilizzarla nelle attività in tempo reale. Le immagini devono essere salvate nel contenitore condiviso per essere accessibili dall'estensione del 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
Sezione intitolata “rimuovi immagine”Rimuovi un'immagine salvata dal contenitore condiviso.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { success } = await CapgoLiveActivities.removeImage({ name: 'product-image' });listImages
Sezione intitolata “elenco immagini”Elenco tutte le immagini salvate nel contenitore condiviso.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { images } = await CapgoLiveActivities.listImages();console.log('Saved images:', images);cleanupImages
Sezione intitolata “pulisci immagini”Elimina tutte le immagini salvate dal contenitore condiviso.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.cleanupImages();startTimerSequence
Sottosezione intitolata “startTimerSequence”Inizia una sequenza di timer per allenamenti/sport. Su iOS: Visualizzato nella Live Activity e nell'Isola Dinamica Su Android: Visualizzato come notifica in primo piano con 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
Sottosezione intitolata “pauseTimerSequence”Ferma la sequenza di timer.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.pauseTimerSequence({ sequenceId: 'abc123' });resumeTimerSequence
Sottosezione intitolata “resumeTimerSequence”Riprendi una sequenza di timer sospesa.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.resumeTimerSequence({ sequenceId: 'abc123' });stopTimerSequence
Sottosezione intitolata “stopTimerSequence”Interrompi e annulla la sequenza del timer.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.stopTimerSequence({ sequenceId: 'abc123' });skipTimerStep
Sottosezione intitolata “saltareStepTimer”Saltare al passaggio successivo nella sequenza.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.skipTimerStep({ sequenceId: 'abc123' });previousTimerStep
Sottosezione intitolata “passoTimerPrecedente”Torna indietro al passaggio precedente nella sequenza.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.previousTimerStep({ sequenceId: 'abc123' });getTimerState
Sottosezione intitolata “ottenereStatoTimer”Ottenere lo stato corrente di una sequenza di 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`);Riferimento di tipo
Sezione intitolata “Riferimento di tipo”AreActivitiesSupportedResult
Sezione intitolata “AreActivitiesSupportedResult”Risultato della verifica se le attività sono supportate.
export interface AreActivitiesSupportedResult { /** Whether Live Activities are supported on this device */ supported: boolean; /** Reason if not supported */ reason?: string;}StartActivityOptions
Sezione intitolata “StartActivityOptions”Opzioni per avviare un'attività in tempo reale.
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
Sezione intitolata “StartActivityResult”Risultato dell'avvio di un'attività.
export interface StartActivityResult { /** Unique activity identifier */ activityId: string;}UpdateActivityOptions
Sezione intitolata “UpdateActivityOptions”Opzioni per aggiornare un'attività in tempo reale.
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
Sottosezione intitolata “EndActivityOptions”Opzioni per interrompere un'attività in diretta.
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
Sottosezione intitolata “GetAllActivitiesResult”Risultato di getAllActivities.
export interface GetAllActivitiesResult { /** List of activities */ activities: ActivityInfo[];}SaveImageOptions
Sottosezione intitolata “SaveImageOptions”Opzioni per salvare un'immagine.
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
Sottosezione intitolata “SaveImageResult”Risultato del salvataggio dell'immagine.
export interface SaveImageResult { /** Whether the save was successful */ success: boolean; /** Saved image name */ imageName: string;}RemoveImageOptions
Sottosezione intitolata “RemoveImageOptions”Opzioni per eliminare un'immagine.
export interface RemoveImageOptions { /** Name of the image to remove */ name: string;}RemoveImageResult
Sottosezione intitolata “RemoveImageResult”Risultato dell'eliminazione di un'immagine.
export interface RemoveImageResult { /** Whether the removal was successful */ success: boolean;}ListImagesResult
Sottosezione intitolata “ListImagesResult”Risultato della lista delle immagini.
export interface ListImagesResult { /** List of saved image names */ images: string[];}TimerSequenceOptions
Sottosezione intitolata “TimerSequenceOptions”Opzioni per avviare una sequenza di 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;}Fonte di Verità
Sottosezione intitolata “Fonte di Verità”Questa pagina è generata dal plugin’s src/definitions.ts. Riavvia la sincronizzazione quando le informazioni pubbliche API cambiano in fase di sviluppo.
Continua da qui: Iniziare
Sottosezione intitolata “Continua da qui: Iniziare”Se stai utilizzando Iniziare per pianificare il dashboard e le API operazioni, connettilo con Utilizza @capgo/capacitor-live-attività per la capacità nativa in Utilizza @capgo/capacitor-live-attività, API Panoramica per i dettagli di implementazione in API Panoramica Introduzione per i dettagli di implementazione in Introduzione API Chiavi per i dettagli di implementazione in API Chiavi, e Dispositivi per i dettagli di implementazione in Dispositivi.