WKExtendedRuntimeSession столкнулся с внутренней ошибкой: «StartSession не может быть вызван в запланированном сеансе»

#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())