跳过内容

开始使用

GitHub

您可以使用我们的 AI 助手设置来安装插件。使用以下命令将 Capgo 技能添加到您的 AI 工具中:

终端窗口
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

然后使用以下提示:

Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/capacitor-live-activities` plugin in my project.

如果您更喜欢手动设置,请按照以下命令安装插件并遵循以下平台特定的说明:

终端窗口
bun add @capgo/capacitor-live-activities
bunx cap sync

iOS 设置

iOS 设置

安装和同步插件不会创建原生 Live 活动 UI。ActivityKit 需要一个 Widget 扩展来注册一个 Live 活动配置,以便 startActivity 可以显示任何内容。

  • 在 iOS 设备或兼容的模拟器上进行测试。动态岛仅在支持的设备模型上可见;其他设备使用锁屏演示。
  • 保持组合静态和动态 ActivityKit 数据在 Apple 的 4 KB 限制以下。
  • 1. 创建一个 Widget 扩展

iOS 原生项目:

终端窗口

__CAPGO_KEEP_0__

__CAPGO_KEEP_1__
bunx cap open ios

然后:

  1. 选择 文件 > 新建 > 目标.
  2. 添加一个 小部件扩展.
  3. 启用 包含实时活动.
  4. 禁用 包含配置意图 除非应用程序还需要一个可配置的小部件。
  5. 确保生成的扩展嵌入在主应用程序目标中。

The Widget Extension must contain an ActivityConfiguration 并在其 WidgetBundle。它必须提供每个所需的实时活动演示:

  • 锁屏
  • 动态岛扩展
  • 动态岛紧凑的前导和尾随
  • 动态岛最小

仅添加目标是不够的。原生应用或插件必须调用ActivityKit的request、update和end API。扩展必须包含SwiftUI code,可以解码和渲染相同的 ActivityAttributes 和内容状态由这些调用使用。将共享的ActivityKit模型包含在主应用和Widget Extension目标中。Xcode生成的实时活动模板不自动渲染传递给此插件的JSON布局;扩展还需要兼容的原生布局渲染器。

将以下键添加到主应用目标的 Info.plist:

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

如果项目生成其 Info.plist,添加 支持实时活动 使用布尔值 YES 在主应用目标的自定义 iOS 目标属性中代替

3. 配置共享图片的 App 组

标题:3. 配置共享图片的 App 组

只有在使用 saveImage, removeImage, listImages,或 cleanupImages时才需要 App 组。该插件从主应用包标识符中派生 App 组标识符,使用以下格式:

group.<MAIN_APP_BUNDLE_ID>.liveactivities

例如,具有捆绑标识符的应用程序 com.example.delivery 必须使用:

group.com.example.delivery.liveactivities

在 Xcode 中,向主应用程序目标和 Widget 扩展目标添加 App Groups 功能,然后在两个目标上启用相同的标识符。

Live 活动扩展无法访问网络。从主应用程序下载远程图像并将它们保存到共享 App 组,然后从 Live 活动中引用它们。对于捆绑图像,还要在资产的目标成员资格中启用 Widget 扩展。

当使用 behavior.widgetUrl 或计时序列时 tapUrl,请在主应用程序中注册匹配的 URL 方案或 Universal 链接。对于自定义方案,如 myapp://order/12345在主应用目标下添加方案。 Info > URL 类型 设置。

5. 可选:启用服务器驱动更新

标题为“5. 可选:启用服务器驱动更新”

推送通知不是本地更新由应用启动所必需的。要从服务器开始、更新或结束实时活动:

  • 添加 推送通知 能力到主应用目标。
  • 获取 ActivityKit 推送令牌并将它们发送到服务器。
  • 通过 APNs 使用 liveactivity 推送类型发送 ActivityKit 通知。
  • Add NSSupportsLiveActivitiesFrequentUpdates 到主应用 Info.plist 仅在使用场景需要频繁推送更新时添加。

ActivityKit推送令牌与标准用户通知设备令牌是分开的。 仅开启推送通知能力是不够的,服务器驱动的更新需要原生令牌处理和APNs后端。

原生设置清单

原生设置清单

在调用 startActivity前,确保:

  • NSSupportsLiveActivities 在主应用目标中
  • 已启用。 ActivityConfiguration.
  • 小部件扩展嵌入并注册一个 ActivityAttributes 原生ActivityKit实现和小部件扩展使用相同的类型。
  • iOS 16.1 或更高版本的应用程序和小部件扩展部署目标。
  • 在 iOS 设置中启用了应用程序的实时活动。
  • 在使用共享图像时,目标上都启用了匹配的 App 组。
  • widgetUrltapUrl 使用的任何自定义 URL 方案都已注册。

导入

导入
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';

API 概述

API 概述

areActivitiesSupported

是否支持实时活动

检查是否支持此设备上的实时活动。 需要 iOS 16.1+ 和设备支持。

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

使用指定的布局和数据启动一个新的实时活动。

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

更新现有的实时活动的新数据。

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

结束一个实时活动。

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

获取当前所有活跃的实时活动。

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

将图片保存到共享 App Group 容器中,以便在实时活动中使用。 图片必须保存到共享容器中才能从小部件扩展中访问。

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 }

从共享容器中删除保存的图片。

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

列出共享容器中的所有保存的图片。

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

移除共享容器中的所有保存的图片。

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

复制到剪贴板

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

复制到剪贴板

恢复暂停的计时序列(workout/sports)

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

复制到剪贴板

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

stopTimerSequence

复制到剪贴板

停止并关闭计时器序列。

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

跳过序列中的下一步。

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

previousTimerStep

上一个计时器步骤

返回序列中的上一步。

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

复制到剪贴板

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

复制到剪贴板

类型参考

AreActivitiesSupportedResult

活动是否支持结果

检查活动是否支持的结果

export interface AreActivitiesSupportedResult {
/** Whether Live Activities are supported on this device */
supported: boolean;
/** Reason if not supported */
reason?: string;
}

StartActivityOptions

活动启动选项

启动活动的选项

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

启动活动结果

启动活动的结果

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

UpdateActivityOptions

更新活动选项

更新活动的选项

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

结束直播活动的选项。

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

获取所有活动的结果。

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

保存图片的选项。

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

保存图片的结果。

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

RemoveImageOptions

标题:移除图片选项

移除图片的选项。

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

移除图片的结果。

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

列出图片的结果。

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

启动计时器序列的选项。

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

真实数据来源

标题:真实数据来源

本页由插件生成 src/definitions.ts当公共 API 上游发生变化时,请重新运行同步。

从 Getting Started 开始

标题:从 Getting Started 开始

如果您正在使用 Getting Started 来规划仪表板和 API 操作,请将其连接到 使用 @capgo/capacitor-live-activities 为 Using @capgo/capacitor-live-activities 中的原生能力 API概述 API概述的实现细节 介绍 介绍的实现细节 API密钥 API密钥的实现细节 设备 设备的实现细节