
Среда
- Flutter: стабильная версия (iOS, физическое устройство)
- Плагин: live_activities: ^2.4.2
- Устройство iOS: 26.0.1
- Runner (приложение) мин. iOS: 13
- Расширение мин iOS: 18.2 (поддерживаются Live Activity; также помечено @available(iOSApplicationExtension 16.1, *))
- Xcode: 26.0.1
- Права:
Приложение и Расширение: Живые действия + Группы приложений - Группа приложений: group.com.example.app (отредактировано)
[*]Целевые зависимости бегуна включают расширение; Пропустить установку = Да для расширения
Симптом
- возвращает идентификатор и визуализирует интерактивную активность.
Код: Выделить всё
createActivity(...) - Повторяющийся updateActivity(...) вызывает журнал «обновлено успешно» с полным состоянием.
- UI остается с настройками Swift по умолчанию (никогда не отражает значения, отправленные Flutter).
Код: Выделить всё
await live.init(appGroupId: 'group.com.example.app', urlScheme: 'vns');
final id = await live.createActivity(
'LiveActivitiesAppAttributes', // also tried '.LiveActivitiesAppAttributes'
{
'name': 'Stress Session',
'state': 'active',
'endTime': '16:33',
'statusMessage': 'Session started',
'intensity': 1,
'isPaused': false,
},
);
await live.updateActivity(id, {
'name': 'Stress Session',
'state': 'active',
'endTime': '16:33',
'statusMessage': 'Intensity level 2',
'intensity': 2,
'isPaused': false,
});
Я попробовал оба пути: чтение непосредственно из context.state.* и чтение из группы приложений UserDefaults с использованием префиксного ключа. Ни один из путей не отражает обновления Flutter; пользовательский интерфейс остается по умолчанию.
Код: Выделить всё
import ActivityKit
import WidgetKit
import SwiftUI
import AppIntents
private func appGroupId() -> String { "group.com.example.app" }
let sharedDefaults = UserDefaults(suiteName: appGroupId())!
struct LiveActivitiesAppAttributes: ActivityAttributes, Identifiable {
public typealias LiveDeliveryData = ContentState
public struct ContentState: Codable, Hashable {
var name: String?
var emoji: String?
var state: String?
var endTime: String?
var statusMessage: String?
var intensity: Int?
var isPaused: Bool?
}
var id = UUID()
}
@available(iOSApplicationExtension 16.1, *)
struct SessionLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in
// Path A: direct ContentState (tried this)
// let sessionName = context.state.name ?? "Default"
// Path B: App Group defaults (tried this as a sanity test)
let sessionName = sharedDefaults.string(forKey: context.attributes.prefixedKey("name")) ??
let endTime = sharedDefaults.string(forKey: context.attributes.prefixedKey("endTime")) ?? "00:00"
let statusMsg = sharedDefaults.string(forKey: context.attributes.prefixedKey("statusMessage")) ?? "active"
let intensity = sharedDefaults.integer(forKey: context.attributes.prefixedKey("intensity"))
let isPaused = sharedDefaults.bool(forKey: context.attributes.prefixedKey("isPaused"))
VStack {
Text(sessionName)
Text(endTime)
Text(statusMsg)
Text("\(intensity)")
Text(isPaused ? "paused" : "active")
}
}
}
}
extension LiveActivitiesAppAttributes {
func prefixedKey(_ key: String) -> String { "\(id)_\(key)" }
}
Код: Выделить всё
[log] Live Activities service initialized successfully
[log] Creating new Live Activity: {name: Stress Session, emoji: ⚡, state: active, endTime: 16:33, statusMessage: Session started, intensity: 1, isPaused: false}
[log] Live Activity created successfully with ID: 148D781F-E307-446B-AEC4-DA2D80A9B012
[log] Sending Live Activity update with full state: {name: Stress Session, emoji: ⚡, state: active, endTime: 16:33, statusMessage: Intensity level 1, intensity: 1, isPaused: false}
[log] Live Activity updated successfully
[log] Sending Live Activity update with full state: {... intensity: 2, ...}
[log] Live Activity updated successfully
-
Runner → Целевые зависимости включает расширение
-
Расширение Пропустить установку = Да
-
Права на оба цели: живые действия, группы приложений (
)Код: Выделить всё
group.com.example.app -
Создайте один раз в Xcode; физическое устройство
-
Попробовал передать тип с указанием модуля: '.LiveActivitiesAppAttributes'
-
Переименовал состояние → sessionState как в ключах, так и в структуре Swift (чтобы избежать любых особенностей зарезервированных имен)
-
Элементы управления Button(intent:) только для iOS 17 закрыты по доступности (не имеют отношения к этой проблеме декодирования)
-
Также проверено состояние чтения через UserDefaults (группа приложений) с префиксным ключом — пользовательский интерфейс по-прежнему отображает значения по умолчанию
- Идентификаторы пакетов, идентификаторы групп и названия продуктов заменяются заполнителями, такими как group.com.example.app и .
Подробнее здесь: https://stackoverflow.com/questions/798 ... ep-showing