Мое приложение использует ActivityKit, чтобы предоставить пользователю простое время запуска и среду выполнения, определяющую время его живой покерной сессии. Он прекрасно работает в фоновом режиме, и если приложение завершается, активность Live прекращается, и это нормально, счетчик по-прежнему отслеживается внутри приложения в другом месте.
Проблема в том, что если телефон перезагружается, пока активен Live Activity, он остается активным, когда телефон снова включается, и это вызывает всевозможные проблемы при повторном открытии приложения. Я бы хотел, чтобы Live Activity просто отключалась в случае перезагрузки телефона или разряда батареи. Как это решается правильно? Ниже приведена часть моего соответствующего кода для класса TimerViewModel.
class TimerViewModel: ObservableObject {
private var timer: Timer?
@Published var liveSessionStartTime: Date?
@Published var liveSessionTimer: String = "00:00"
@Published var activity: Activity? = nil
@Published var reBuyAmount: String = ""
@Published var initialBuyInAmount: String = ""
@Published var totalRebuys: [Int] = []
var totalBuyInForLiveSession: Int {
(Int(initialBuyInAmount) ?? 0) + rebuyTotalForSession
}
var rebuyTotalForSession: Int {
return totalRebuys.reduce(0,+)
}
static var isCounting: Bool {
UserDefaults.standard.object(forKey: "liveSessionStartTime") != nil
}
init() {
NotificationCenter.default.addObserver(self, selector: #selector(appDidResume), name: UIApplication.willEnterForegroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(appWillResignActive), name: UIApplication.willResignActiveNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminate), name: UIApplication.willTerminateNotification, object: nil)
// Attempt to recover liveSessionStartTime from UserDefaults
guard let startTime = UserDefaults.standard.object(forKey: "liveSessionStartTime") as? Date else {
print("No Live Session start time found.")
return
}
liveSessionStartTime = startTime
updateElapsedTime()
startUpdatingTimer()
initialBuyInAmount = UserDefaults.standard.string(forKey: "initialBuyInAmount") ?? ""
totalRebuys = UserDefaults.standard.array(forKey: "totalRebuys") as? [Int] ?? []
}
func startSession() {
let now = Date()
liveSessionStartTime = now
UserDefaults.standard.set(now, forKey: "liveSessionStartTime")
UserDefaults.standard.set(initialBuyInAmount, forKey: "initialBuyInAmount")
UserDefaults.standard.set(totalRebuys, forKey: "totalRebuys")
startUpdatingTimer()
scheduleUserNotification()
if ActivityAuthorizationInfo().areActivitiesEnabled {
let attributes = LiveSessionWidgetAttributes(eventDescription: "Live Session")
let state = LiveSessionWidgetAttributes.TimerStatus(startTime: now, elapsedTime: self.liveSessionTimer)
do {
activity = try Activity.request(attributes: attributes,
content: .init(state: state, staleDate: nil),
pushType: nil)
} catch {
print("Error: \(error)")
}
}
}
Когда пользователь вручную останавливает сеанс и завершает таймер, этот код вызывается для завершения действия, и это работает.
func stopTimer() {
timer?.invalidate()
UserDefaults.standard.removeObject(forKey: "liveSessionStartTime")
UserDefaults.standard.removeObject(forKey: "initialBuyInAmount")
UserDefaults.standard.removeObject(forKey: "totalRebuys")
// End Activity
Task {
await Activity.activities.first?.end(activity?.content, dismissalPolicy: .immediate)
}
cancelUserNotifications()
}
И, наконец, этот фрагмент — это то, что, как я думал, сможет справиться с перезагрузкой телефона в случае закрытия приложения. Однако, похоже, это не так.
func endActivityKit() {
print("Ending Live Activities")
let semaphore = DispatchSemaphore(value: 0)
Task {
for activity in Activity.activities {
print("Ending Live Activity: \(activity.id)")
await activity.end(nil, dismissalPolicy: .immediate)
}
semaphore.signal()
}
semaphore.wait()
}
@objc func applicationWillTerminate(_ application: UIApplication) {
print("Application will terminate...")
endActivityKit()
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... s-rebooted
Live Activity продолжает работать после перезагрузки iPhone ⇐ IOS
Программируем под IOS
-
Anonymous
1719000618
Anonymous
Мое приложение использует ActivityKit, чтобы предоставить пользователю простое время запуска и среду выполнения, определяющую время его живой покерной сессии. Он прекрасно работает в фоновом режиме, и если приложение завершается, активность Live прекращается, и это нормально, счетчик по-прежнему отслеживается внутри приложения в другом месте.
Проблема в том, что если телефон перезагружается, пока активен Live Activity, он остается активным, когда телефон снова включается, и это вызывает всевозможные проблемы при повторном открытии приложения. Я бы хотел, чтобы Live Activity просто отключалась в случае перезагрузки телефона или разряда батареи. Как это решается правильно? Ниже приведена часть моего соответствующего кода для класса TimerViewModel.
class TimerViewModel: ObservableObject {
private var timer: Timer?
@Published var liveSessionStartTime: Date?
@Published var liveSessionTimer: String = "00:00"
@Published var activity: Activity? = nil
@Published var reBuyAmount: String = ""
@Published var initialBuyInAmount: String = ""
@Published var totalRebuys: [Int] = []
var totalBuyInForLiveSession: Int {
(Int(initialBuyInAmount) ?? 0) + rebuyTotalForSession
}
var rebuyTotalForSession: Int {
return totalRebuys.reduce(0,+)
}
static var isCounting: Bool {
UserDefaults.standard.object(forKey: "liveSessionStartTime") != nil
}
init() {
NotificationCenter.default.addObserver(self, selector: #selector(appDidResume), name: UIApplication.willEnterForegroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(appWillResignActive), name: UIApplication.willResignActiveNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminate), name: UIApplication.willTerminateNotification, object: nil)
// Attempt to recover liveSessionStartTime from UserDefaults
guard let startTime = UserDefaults.standard.object(forKey: "liveSessionStartTime") as? Date else {
print("No Live Session start time found.")
return
}
liveSessionStartTime = startTime
updateElapsedTime()
startUpdatingTimer()
initialBuyInAmount = UserDefaults.standard.string(forKey: "initialBuyInAmount") ?? ""
totalRebuys = UserDefaults.standard.array(forKey: "totalRebuys") as? [Int] ?? []
}
func startSession() {
let now = Date()
liveSessionStartTime = now
UserDefaults.standard.set(now, forKey: "liveSessionStartTime")
UserDefaults.standard.set(initialBuyInAmount, forKey: "initialBuyInAmount")
UserDefaults.standard.set(totalRebuys, forKey: "totalRebuys")
startUpdatingTimer()
scheduleUserNotification()
if ActivityAuthorizationInfo().areActivitiesEnabled {
let attributes = LiveSessionWidgetAttributes(eventDescription: "Live Session")
let state = LiveSessionWidgetAttributes.TimerStatus(startTime: now, elapsedTime: self.liveSessionTimer)
do {
activity = try Activity.request(attributes: attributes,
content: .init(state: state, staleDate: nil),
pushType: nil)
} catch {
print("Error: \(error)")
}
}
}
Когда пользователь вручную останавливает сеанс и завершает таймер, этот код вызывается для завершения действия, и это работает.
func stopTimer() {
timer?.invalidate()
UserDefaults.standard.removeObject(forKey: "liveSessionStartTime")
UserDefaults.standard.removeObject(forKey: "initialBuyInAmount")
UserDefaults.standard.removeObject(forKey: "totalRebuys")
// End Activity
Task {
await Activity.activities.first?.end(activity?.content, dismissalPolicy: .immediate)
}
cancelUserNotifications()
}
И, наконец, этот фрагмент — это то, что, как я думал, сможет справиться с перезагрузкой телефона в случае закрытия приложения. Однако, похоже, это не так.
func endActivityKit() {
print("Ending Live Activities")
let semaphore = DispatchSemaphore(value: 0)
Task {
for activity in Activity.activities {
print("Ending Live Activity: \(activity.id)")
await activity.end(nil, dismissalPolicy: .immediate)
}
semaphore.signal()
}
semaphore.wait()
}
@objc func applicationWillTerminate(_ application: UIApplication) {
print("Application will terminate...")
endActivityKit()
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78652349/live-activity-is-still-running-after-iphone-is-rebooted[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия