Live Activity продолжает работать после перезагрузки iPhoneIOS

Программируем под IOS
Ответить
Anonymous
 Live Activity продолжает работать после перезагрузки iPhone

Сообщение 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()
}


Подробнее здесь: https://stackoverflow.com/questions/786 ... s-rebooted
Ответить

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

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

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

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

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