Saltare al contenuto

Iniziare

GitHub

Puoi utilizzare la nostra configurazione assistita dall'IA per installare il plugin. Aggiungi le Capgo abilitazioni al tuo strumento di AI utilizzando il seguente comando:

Finestra del terminale
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

Poi 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 l'installazione manuale, installa il plugin eseguendo i seguenti comandi e segui le istruzioni specifiche per la piattaforma riportate di seguito:

Finestra del terminale
bun add @capgo/capacitor-live-activities
bunx cap sync

L'installazione e la sincronizzazione del plugin non creano l'interfaccia nativa dell'attività in tempo reale. L'ActivityKit richiede un'estensione del widget che registra una configurazione dell'attività in tempo reale prima di poter visualizzare qualcosa. startActivity Requisiti

  • Testa l'app 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.
  • Mantieni i dati statici e dinamici dell'ActivityKit al di sotto del limite di 4 KB stabilito da Apple.
  • iOS Setup

Apre il progetto iOS nativo:

Fermata di comando
bunx cap open ios

Poi:

  1. Scegli File > Nuovo > Target.
  2. Aggiungi un Estensione di Widget.
  3. Abilita Includi l'attività in tempo reale.
  4. Disabilita Includi Configurazione Intent a meno che l'app non richieda anche un widget configurabile.
  5. 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à Live richiesta:

  • Schermo Bloccato
  • Isola Dinamica espansa
  • Isola Dinamica compatta con testo in alto e in basso
  • Isola Dinamica 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 che possa decodificare e rendere lo stesso ActivityAttributes e lo stato del contenuto utilizzato da quelle chiamate. Includi i modelli condivisi di ActivityKit in entrambi i target dell'app principale e dell'estensione Widget. Il modello 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.

Aggiungi la seguente chiave ai proprietà iOS personalizzati del target dell'app principale: Info.plist:

<key>NSSupportsLiveActivities</key>
<true/>

Se il progetto genera i Info.plist, aggiungi Sostiene le attività live con un valore booleano di YES sotto le proprietà iOS personalizzati del target dell'app principale.

Un gruppo di app è richiesto solo quando si utilizza saveImage, removeImage, listImages, o cleanupImages. Il plugin deriva l'identificatore del gruppo di app dall'identificatore del bundle principale utilizzando questo formato esatto:

group.<MAIN_APP_BUNDLE_ID>.liveactivities

Esempio: un'app con identificatore del bundle com.example.delivery deve utilizzare:

group.com.example.delivery.liveactivities

In Xcode, aggiungi la abilità dei gruppi di app a entrambi il target dell'app 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'app principale e salvale nel gruppo di 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.

Quando si utilizza behavior.widgetUrl o una sequenza di timer tapUrl, registrare lo schema di URL corrispondente o il collegamento universale nella app principale. Per uno schema personalizzato come myapp://order/12345, aggiungere lo schema sotto le impostazioni Info > Tipi di URL del target dell'app principale.

5. Facoltativo: Abilita Aggiornamenti Server-Driven

Sezione intitolata “5. Facoltativo: Abilita Aggiornamenti Server-Driven”

Il notifiche push non sono necessarie per gli aggiornamenti locali iniziali dall'app. Per iniziare, aggiornare o terminare le attività in diretta da un server:

  • Aggiungi il Il notifiche push abilità alla app principale di destinazione.
  • Ottenere i token di push di ActivityKit e inviarli al server.
  • Inviare notifiche di ActivityKit attraverso APNs utilizzando il liveactivity tipo di push.
  • Aggiungi NSSupportsLiveActivitiesFrequentUpdates alla app principale Info.plist solo quando il caso d'uso richiede aggiornamenti di push frequenti.

I token di push di ActivityKit sono separati dai token di notifica standard per dispositivi dell'utente. Abilitare la capacità di notifiche push da solo non è sufficiente; gli aggiornamenti server richiedono un trattamento nativo dei token e un backend APNs.

Prima di chiamare startActivity, verificare che:

  • NSSupportsLiveActivities è 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 ActivityAttributes tipo.
  • Il target di distribuzione dell'app e dell'estensione del Widget sono iOS 16.1 o successivi.
  • Gli 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 widgetUrl o tapUrl è registrato.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';

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

Avvia una nuova attività in tempo reale con il layout 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);

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

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

Ottieni tutte le attività in corso attualmente.

import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { activities } = await CapgoLiveActivities.getAllActivities();
activities.forEach(activity => {
console.log(`Activity ${activity.activityId}: ${activity.state}`);
});

Salva un'immagine nel contenitore condiviso di App Group per utilizzarla nelle attività in diretta. 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 }

Elimina un'immagine salvata dal contenitore condiviso.

import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { success } = await CapgoLiveActivities.removeImage({ name: 'product-image' });

Elencare tutte le immagini salvate nel contenitore condiviso.

import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { images } = await CapgoLiveActivities.listImages();
console.log('Saved images:', images);

Rimuovere tutte le immagini salvate dal contenitore condiviso.

import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.cleanupImages();

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

Pausa la sequenza di timer.

import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.pauseTimerSequence({ sequenceId: 'abc123' });

Riprendere la sequenza di timer sospesa.

import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.resumeTimerSequence({ sequenceId: 'abc123' });

Fermare e chiudere la sequenza di timer.

import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.stopTimerSequence({ sequenceId: 'abc123' });

Saltare allo step successivo nella sequenza.

import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.skipTimerStep({ sequenceId: 'abc123' });

Ritornare allo step precedente nella sequenza.

import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
await CapgoLiveActivities.previousTimerStep({ sequenceId: 'abc123' });

Ottieni 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`);

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

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

Risultato di avvio di un'attività.

export interface StartActivityResult {
/** Unique activity identifier */
activityId: string;
}

Opzioni per l'aggiornamento di 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;
}

Opzioni per la fine di un'attività in tempo reale.

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

Risultato di getAllActivities.

export interface GetAllActivitiesResult {
/** List of activities */
activities: ActivityInfo[];
}

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

Risultato della salvaguardia dell'immagine.

export interface SaveImageResult {
/** Whether the save was successful */
success: boolean;
/** Saved image name */
imageName: string;
}

Opzioni per rimuovere un'immagine.

export interface RemoveImageOptions {
/** Name of the image to remove */
name: string;
}

Risultato della rimozione dell'immagine.

export interface RemoveImageResult {
/** Whether the removal was successful */
success: boolean;
}

Risultato della lista delle immagini.

export interface ListImagesResult {
/** List of saved image names */
images: string[];
}

Opzioni per l'avvio di 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;
}

Questa pagina è generata dal plugin. src/definitions.ts. Riavvia la sincronizzazione quando i dati pubblici API cambiano upstream.

Se stai utilizzando Inizio per pianificare la dashboard e le API operazioni, connettilo con Utilizzando @capgo/capacitor-live-attività per la capacità nativa in Utilizzando @capgo/capacitor-live-attività, Panoramica di API per i dettagli di implementazione in Panoramica di API, Introduzione per i dettagli di implementazione in Introduzione, Chiavi di API per i dettagli di implementazione in Chiavi di API, e Dispositivi per i dettagli di implementazione in Dispositivi.