Activity State

Send small Codable state from a companion app to a DynamicLake extension.

Overview

Use DynamicLakeActivityCenter from the companion app. Do not post activity state from extension UI.

Use DynamicLakeActivityStateReader in direct extension views. Use provider context when building simulator or demo UI.

Define State

Keep state small and stable.

import DynamicLakeKit

struct ClockActivityState: DynamicLakeLiveActivityState {
    var timeText: String
}

Open With State

Use the extension bundle identifier, not the companion app bundle identifier.

try DynamicLakeActivityCenter.setActivityActive(
    true,
    extensionBundleIdentifier: "com.example.ClockDynamicLakeExtension",
    title: "Clock",
    priority: .normal,
    supportsSneakPeek: true,
    size: .large,
    state: ClockActivityState(timeText: "12:45")
)

Update State

Post the new state when the activity is already active.

try DynamicLakeActivityCenter.updateActivityState(
    extensionBundleIdentifier: "com.example.ClockDynamicLakeExtension",
    state: ClockActivityState(timeText: "12:46")
)

Read State

In a direct extension view, create a reader with an initial fallback value.

@StateObject private var stateReader = DynamicLakeActivityStateReader<ClockActivityState>(
    initialState: ClockActivityState(timeText: "--:--")
)

Render from stateReader.state.

Text(stateReader.state?.timeText ?? "--:--")

Close Activity

Close the activity when it should disappear.

DynamicLakeActivityCenter.closeActivity(
    extensionBundleIdentifier: "com.example.ClockDynamicLakeExtension"
)

Topics

State APIs