Iniziato
Copia un prompt di impostazione con i passaggi 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.
Puoi utilizzare la nostra configurazione assistita da AI per installare il plugin. Aggiungi le Capgo abilità al tuo strumento AI utilizzando il seguente comando:
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-pluginsUsa poi 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 del tuo platform qui sotto:
bun add @capgo/capacitor-live-activitiesbunx cap syncConfigurazione iOS
Sezione intitolata “Configurazione iOS”L'installazione e la 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 startActivity di poter visualizzare qualcosa.
Requisiti
Sezione intitolata “Requisiti”- Usa iOS 16.1 o successiva per entrambi il target dell'app e il target dell'Estensione del Widget.
- Testa l'app su un dispositivo iOS o un simulatore compatibile. L'Isola Dinamica si visualizza solo su dispositivi supportati; gli altri dispositivi utilizzano la presentazione della Schermata di Blocco.
- Mantieni i dati statici e dinamici di ActivityKit al di sotto del 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:
bunx cap open iosPoi:
- Seleziona File > Nuovo > Target.
- Aggiungi un Estensione del Widget.
- Abilita Includi l'attività in tempo reale.
- Sospendi Includi l'intento di configurazione se l'app non ha bisogno anche di un widget configurabile.
- Assicurati che l'estensione generata sia incorporata nel target dell'app principale.
L'Estensione del Widget deve contenere un ActivityConfiguration e registrarlo nel suo WidgetBundle. Deve fornire ogni presentazione di attività in tempo reale richiesta:
- Schermo Bloccato
- Dinamico Isola espansa
- Dinamico Isola compatto e margini
- Dinamico Isola minima
Aggiungere solo il target non è sufficiente. L'app nativa o il plugin devono chiamare le API di ActivityKit per richiesta, aggiornamento e fine. L'estensione deve contenere SwiftUI code in grado di decodificare e rendere lo stesso ActivityAttributes e stato di contenuto utilizzato da quelle chiamate. Includere modelli condivisi di ActivityKit in entrambi i target dell'app principale e dell'estensione Widget. Il template di attività live 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 Info.plist, aggiungine Sostiene le attività in tempo reale con un valore booleano di YES sotto le proprietà del target iOS personalizzato del main app target.
3. Configura il gruppo dell'app per le immagini condivise
Sottosezione intitolata “3. Configura il gruppo dell'app per le immagini condivise”Un gruppo dell'app è richiesto solo quando si utilizza saveImage, removeImage, listImages, o cleanupImages. Il plugin deriva l'identificatore del gruppo dell'app dall'identificatore del bundle dell'app principale utilizzando questo formato esatto:
group.<MAIN_APP_BUNDLE_ID>.liveactivitiesAd esempio, un'app con identificatore del bundle com.example.delivery deve utilizzare:
group.com.example.delivery.liveactivitiesIn Xcode, aggiungi la capacità di "App Groups" a entrambi i target principale e dell'estensione Widget, quindi abilita lo stesso identificatore su entrambi i target. App Groups Le estensioni delle attività in tempo reale non possono accedere a rete. Scarica le immagini remote nell'app principale e salvale 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 dei target degli asset.
4. Configura i collegamenti profondi
Sezione intitolata “4. Configura i collegamenti profondi”
Quando si utilizzao una sequenza di timer behavior.widgetUrl , registrare lo schema di URL corrispondente o il collegamento universale nell'app principale. Per uno schema personalizzato come tapUrl, aggiungi lo schema sotto le impostazioni "Info > Tipi di URL" del target dell'app principale. myapp://order/12345__CAPGO_KEEP_0__ __CAPGO_KEEP_0__ __CAPGO_KEEP_0__
5. Opzionale: Abilita Aggiornamenti Server-Driven
Sezione intitolata “5. Opzionale: Abilita Aggiornamenti Server-Driven”Le notifiche Push non sono necessarie per gli aggiornamenti locali iniziali dall'app. Per iniziare, aggiornare o terminare le Attività Live da un server:
- Aggiungi il Notifiche Push capacità al target principale dell'app.
- Otteni i token di notifica di ActivityKit e inviali al server.
- Invia notifiche di ActivityKit attraverso APNs utilizzando il
liveactivitytipo di notifica. - Aggiungi
NSSupportsLiveActivitiesFrequentUpdatessolo al target principale dell'appInfo.plistsolo quando il caso d'uso richiede aggiornamenti di notifica Push frequenti.
Le token di ActivityKit sono separati dai token di notifica standard per dispositivi. L'abilitazione della capacità delle notifiche push da sola non è sufficiente; le aggiornamenti server 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:
NSSupportsLiveActivitiesè abilitato sul target principale dell'app.- La Widget Extension è incorporata e registra un
ActivityConfiguration. - La implementazione nativa di ActivityKit e la Widget Extension utilizzano lo stesso
ActivityAttributestipo. - L'app e la Widget Extension hanno come target di distribuzione iOS 16.1 o successivo.
- Le attività in tempo reale sono abilitate per l'app nei impostazioni iOS.
- Il gruppo di app corrispondente è abilitato su entrambi i target quando si utilizzano immagini condivise.
- Qualsiasi schema di URL personalizzato utilizzato da
widgetUrlotapUrlè registrato.
Importa
Sezione intitolata “Importa”import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';API Panoramica
Sezione intitolata “API Panoramica”areActivitiesSupported
Sezione intitolata “areActivitiesSupported”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
Sezione intitolata “inizia attività”Inizia una nuova attività in diretta con lo schema e i dati specificati.
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
Sezione intitolata “aggiorna attività”Aggiorna un'attività in diretta 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
Sezione intitolata “fine attività”Fine un'attività in diretta.
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
Sezione intitolata “ottieni tutte le attività”Ottieni tutte le attività in diretta 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 nella condivisione del contenitore App Group 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
Sottosezione 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' });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
Sottosezione intitolata “pulisci immagini”Rimuovi tutte le immagini salvate dal contenitore condiviso.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.cleanupImages();startTimerSequence
Sottosezione intitolata “avvia sequenza timer”Inizia una sequenza di timer per allenamenti/sport. Su iOS: Mostra in Live Activity e Dynamic Island Su Android: Mostra come una 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
Sezione intitolata “pauseTimerSequence”Pausa la sequenza di timer.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.pauseTimerSequence({ sequenceId: 'abc123' });resumeTimerSequence
Sezione intitolata “resumeTimerSequence”Ripristina una sequenza di timer sospesa.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.resumeTimerSequence({ sequenceId: 'abc123' });stopTimerSequence
Sezione intitolata “stopTimerSequence”Interrompi e annulla la sequenza di timer.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.stopTimerSequence({ sequenceId: 'abc123' });skipTimerStep
Sezione intitolata “skipTimerStep”Saltare al passaggio successivo nella sequenza.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.skipTimerStep({ sequenceId: 'abc123' });previousTimerStep
Sezione intitolata “previousTimerStep”Torna al passaggio precedente nella sequenza.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.previousTimerStep({ sequenceId: 'abc123' });getTimerState
Sezione intitolata “getTimerState”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 diretta.
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 diretta.
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
Sezione intitolata “EndActivityOptions”Opzioni per terminare 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
Sezione intitolata “GetAllActivitiesResult”Risultato di getAllActivities.
export interface GetAllActivitiesResult { /** List of activities */ activities: ActivityInfo[];}SaveImageOptions
Sezione 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
Sezione intitolata “SaveImageResult”Risultato del salvataggio dell'immagine.
export interface SaveImageResult { /** Whether the save was successful */ success: boolean; /** Saved image name */ imageName: string;}RemoveImageOptions
Sezione intitolata “RemoveImageOptions”Opzioni per rimuovere un'immagine.
export interface RemoveImageOptions { /** Name of the image to remove */ name: string;}RemoveImageResult
Sezione intitolata “RimuoviImmagineRisultato”Risultato della rimozione di un'immagine.
export interface RemoveImageResult { /** Whether the removal was successful */ success: boolean;}ListImagesResult
Sezione intitolata “ElencoImmaginiRisultato”Risultato dell'elenco delle immagini.
export interface ListImagesResult { /** List of saved image names */ images: string[];}TimerSequenceOptions
Sezione intitolata “TimerSequenzaOpzioni”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à
Sezione intitolata “Fonte di Verità”Questa pagina è generata dal plugin src/definitions.tsRiepilogare la sincronizzazione quando le informazioni pubbliche API cambiano in fase di sviluppo
Continua da Iniziare
Sezione intitolata “Continua da Iniziare”Se stai utilizzando Iniziare per pianificare il dashboard e le operazioni di API, connettilo con Utilizza @capgo/capacitor-live-attività per la capacità nativa in Utilizza @capgo/capacitor-live-attività API Overview per i dettagli di implementazione in API Overview 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.