#swift #swiftui
#swift #swiftui
Вопрос:
Я пытаюсь реализовать фоновый сеанс для своего приложения, но при попытке запустить сеанс нажатием кнопки я получаю следующую ошибку:
WKExtendedRuntimeSession hit internal error. Error Domain=com.apple.CarouselServices.SessionErrorDomain Code=17 "startSession cannot be called on a scheduled session" UserInfo={NSLocalizedDescription=startSession cannot be called on a scheduled session}
Есть идеи, почему? Это мой код. Я попытался найти ошибку в Google, но нигде не нашел решения. Для фонового сеанса я использовал возможность фоновых режимов и выбрал тип сеанса smart alarm (других вариантов нет):
import SwiftUI
final class ExtendedRunTimeService {
private var session: WKExtendedRuntimeSession?
func start() {
guard session?.state != .running else { return }
if nil == session || session?.state == .invalid {
session = WKExtendedRuntimeSession()
}
print("session started")
session?.start()
}
func stop() {
session?.invalidate()
}
}
И я начинаю его через:
import Combine
final class ClockDataViewModel: ObservableObject {
@Published var motionValues = MotionValues()
@Published var healthValues = HealthValues()
var motionService = MotionService()
var healthService = HealthService()
var cancellables = Set<AnyCancellable>()
var backGroundService = ExtendedRunTimeService()
init() {
motionService.$motionValues
.combineLatest(healthService.$healthValues)
.sink(receiveValue: {
self.motionValues = $0
self.healthValues = $1
})
.store(in: amp;cancellables)
}
func startUpdates() {
backGroundService.start()
motionService.startMotionUpdates()
healthService.fetchHeartRateData(quantityTypeIdentifier: .heartRate)
}
func stopUpdates() {
backGroundService.stop()
motionService.stopMotionUpdates()
healthService.stopFetchingHeartRateData()
}
Ответ №1:
Хорошо, итак, разобрались. Для интеллектуального будильника я должен использовать метод start(at: ), требующий будущей даты начала сеанса.
session?.start(at: Date())