后台任务未运行

Posted

技术标签:

【中文标题】后台任务未运行【英文标题】:Background task not running 【发布时间】:2020-07-24 15:18:35 【问题描述】:

我正在尝试在后台检查一些 HealthKit 数据,并在满足某些条件时发送本地通知。

我添加了后台获取功能并将我的任务 ID 添加到 info.plist

后台任务代码如下:

func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
        
        // other setups

        self.setupHealthKit()

        self.setupBackgroundTasks()
        
        return true
    

fileprivate func setupHealthKit() 
        
        HealthKitHelper.shared.executeObserverQuery(for: HealthKitTypes.activeEnergy,
                                                predicate: nil)
        .sink(receiveCompletion: 
            completion in
            switch completion 
            case .failure(let error):
                print("observer query execution failed with error: \(error.localizedDescription)")
                EventLogger.BackgroundDelivery.logObserverQueryError(error: error.localizedDescription)
            case .finished:
                print("observer query executed.")
            
        , receiveValue: 
            query, handler in
            // we have some updates
            
            EventLogger.BackgroundDelivery.logObserverQueryResultInBackground()
            
            // check if there is a new sleep session
            
            let queue = OperationQueue()
            
            let operations = self.getBackgroundOperations()
            
            let last = operations.last!
            last.completionBlock = 
                handler()
            
            
            queue.addOperations(operations, waitUntilFinished: false)
            
        )
        .store(in: &self.subscriberStore)
        
        HealthKitHelper.shared.enableBackgroundDelivery(for: HealthKitTypes.activeEnergy,
                                                        frequency: .hourly)
            .sink(receiveCompletion: 
                completion in
                switch completion 
                case .failure(let error):
                    print("failed to enable bg delivery with error: \(error.localizedDescription)")
                case .finished:
                    print("delivery enable finished.")
                
            , receiveValue: 
                status in
                print("delivery enable success status: \(status)")
            )
            .store(in: &self.subscriberStore)
        
    
    
func setupBackgroundTasks() 
        
        let status = BGTaskScheduler.shared.register(forTaskWithIdentifier: self.BACKGROUND_FETCH_TASK_ID,
                                                     using: nil) 
            task in
            
            self.handleBackgroundAppRefresh(task as! BGAppRefreshTask)
            
        
        
    

我只是在后台任务中发送本地通知,看看它是否有效。 现在我可以在调试器中运行后台任务,但它永远不会被系统执行。

而且我也不知道在后台获取新的健康包样本的最佳方法是什么。

【问题讨论】:

运气好能解决这个问题吗?这里有同样的问题.. 我停止使用 combine 处理后台任务,它解决了问题。 【参考方案1】:

您必须使用 HKObserverQuery 在后台查询健康数据。

【讨论】:

我已经在使用 HKObserverQuery 但它没有被调用。我会将我的代码添加到问题中。

以上是关于后台任务未运行的主要内容,如果未能解决你的问题,请参考以下文章

通知操作后台任务未按预期运行

后台任务运行时未调用 iOS applicationWillEnterForeground 和黑屏

Elixir 长时间运行的后台任务未完成,有时会崩溃

应用在后台运行一段时间后,Firebase 存储下载任务未完成

在后台运行长时间运行的并行任务,同时允许小型异步任务更新前台

Android在后台运行任务时关闭屏幕