Обновления Live Activity регистрируют «успех», но экран блокировки/динамический остров продолжают показывать значения поIOS

Программируем под IOS
Ответить
Anonymous
 Обновления Live Activity регистрируют «успех», но экран блокировки/динамический остров продолжают показывать значения по

Сообщение Anonymous »

Живое действие запускается и отображается на экране блокировки/динамическом острове, а журналы Flutter сообщают, что вызовы updateActivity(...) завершаются успешно с полной полезной нагрузкой. Однако пользовательский интерфейс виджета никогда не отражает эти обновления — он показывает только значения по умолчанию, определенные в Swift.
Изображение


Среда
  • 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).
Минимальная репродукция (Dart)

Код: Выделить всё

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,
});
Виджет (Swift, упрощенный)

Я попробовал оба пути: чтение непосредственно из 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»