'Для задачи с идентификатором ... не зарегистрирован обработчик запуска ...' (Swift) - PullRequest
0 голосов
/ 29 мая 2020

У меня есть этот код, который является преобразованием текста в речь, и в конце он открывает браузер по умолчанию с указанной ссылкой

func speak(text : String, callback : (() -> Void)? = nil, link: String) {
        let state = returnState()
        print(state)
        if state == .quiet {
            do {

                self.state = .speaking
                try audioSession.setCategory(AVAudioSession.Category.playback)
                try audioSession.setMode(AVAudioSession.Mode.default)
                try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
                let utterance = AVSpeechUtterance(string: text)
                utterance.voice = AVSpeechSynthesisVoice(language: language)
                synthesizer.speak(utterance)
                self.showWaveform()
                self.callbackSpeak = callback
                let url = URL(string: link)!
                let seconds = 4.0
                DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
                    UIApplication.shared.open(url)
                }

            } catch {
                print("audioSession properties weren't set because of an error.")
            }
        }
    }

Я все время получаю эту ошибку:

'No launch handler registered for task with identifier com.maps.fetch.activities'

Я проверил разрешения и в разделе «Разрешенные идентификаторы планировщика фоновых задач» у меня есть «com.maps.fetch.activities».

enter image description here

Я думаю, мне нужно зарегистрировать задачу с этим идентификатором, но я не совсем уверен, что это такое и где мне это делать. Не могли бы вы мне с этим помочь?

1 Ответ

0 голосов
/ 07 июня 2020

Это потому, что вы не позвонили BGTaskScheduler.shared.register в didFinishLaunchingWithOptions.

if ( !BGTaskScheduler.shared.register(forTaskWithIdentifier: BackupTask.identifier,
                    using: nil) { task in
    BackupTask.handleProcess(task as? BGProcessingTask)
} ){
    logHelper.w("BackupTask register failed.")
}

И поместили это в applicationDidEnterBackground.

if #available(iOS 13.0, *) {
    BackupTask.scheduleProcessing()
}

Вот что scheduleProcessing выглядит так.

@available(iOS 13, *)
static func scheduleProcessing() {
    let logHelper = LogHelper(subsystem: "TimeMachineTask", category: "scheduleProcessing")

    let request = BGAppRefreshTaskRequest(identifier: TimeMachineTask.identifier)
    // Fetch no earlier than 5 minutes from now
    request.earliestBeginDate = Date(timeIntervalSinceNow:  60 * 15)
    do {
        try BGTaskScheduler.shared.submit(request)
        logHelper.i("Submit new request.")
    } catch {
        logHelper.e("Could not schedule app refresh: %@", error: error)
    }
}

BGTaskScheduler.shared.register сообщает iOS, что делать после запуска фоновой задачи, которая является «обработчиком запуска», который вам не хватает. BackupTask.scheduleProcessing - это то место, где он фактически планирует задание.

Вы можете скачать их образец проекта, чтобы увидеть, как он работает с OperationQueue. https://developer.apple.com/documentation/backgroundtasks/refreshing_and_maintaining_your_app_using_background_tasks

...