使用 HealthKit 后台传递检索步骤后,在后台将数据写入 Firebase

2024-02-29

我有一个HKObserverQuery设置在后台获取步骤(enableBackgroundDelivery方法被调用在application:didFinishLaunchingWithOptions:).

这些步骤是在后台检索的,但我还想将检索到的步骤存储在 Firebase 数据库中。但这部分失败了,Firebase 中没有存储任何内容。当应用程序位于前台时,存储步骤的方法可以正常工作。任何关于如何在后台成功写入 Firebase 数据的想法将不胜感激。

class HealthKitManager {

    static let shared = HealthKitManager()
    private let healthStore = HKHealthStore()
    private let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

    private init() {

    }

    func getTodaysStepCount(completion: @escaping (Double) -> Void) {
        let now = Date()
        let startOfDay = Calendar.current.startOfDay(for: now)
        let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)

        let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (_, result, error) in
            var resultCount = 0.0

            guard let result = result else {
                log.error("Failed to fetch steps = \(error?.localizedDescription ?? "N/A")")
                completion(resultCount)
                return
            }

            if let sum = result.sumQuantity() {
                resultCount = sum.doubleValue(for: HKUnit.count())
            }

            DispatchQueue.main.async {
                completion(resultCount)
            }
        }

        healthStore.execute(query)
    }

    func enableBackgroundDelivery() {
        let query = HKObserverQuery(sampleType: stepsQuantityType, predicate: nil) { [weak self] (query, completionHandler, error) in
            if let error = error {
                log.error("Observer query failed = \(error.localizedDescription)")
                return
            }

            self?.getTodaysStepCount(completion: { steps in
                // Store steps using Firebase:
                StepsManager.shared.updateUserSteps(steps)
                completionHandler()
            })
        }

        healthStore.execute(query)
        healthStore.enableBackgroundDelivery(for: stepsQuantityType, frequency: .hourly) { (success, error) in
            log.debug("Background delivery of steps. Success = \(success)")

            if let error = error {
                log.error("Background delivery of steps failed = \(error.localizedDescription)")
            }
        }
    }

}

好的,我解决了这个问题。问题是,在保存到 Firebase 实际完成之前,我正在调用completionHandler,告诉 HealthKit 我已经完成了操作。保存到 Firebase 是异步完成的。

我添加了一个完成处理程序StepsManager.shared.updateUserSteps功能:

func updateUserSteps(_ steps: Double, completion: (() -> Void)? = nil) {
    let stepsReference = databaseInstance.reference(withPath: stepsPath)
    stepsReference.setValue(steps) { _, _ in
        completion?()
    }
}

databaseRef.setValue已完成。然后我将观察者查询更新为以下内容:

self?.getTodaysStepCount(completion: { steps in
    StepsManager.shared.updateUserSteps(steps) {
        completionHandler() // the HKObserverQueryCompletionHandler
    }
})

Firebase 操作现已正确完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 HealthKit 后台传递检索步骤后,在后台将数据写入 Firebase 的相关文章

随机推荐

  • 在android中使用内容提供程序获取联系号码

    我按照本教程学习了内容提供商的基础知识 http www vogella de articles AndroidSQLite article html http www vogella de articles AndroidSQLite a
  • 使用更改 django 模板中表单字段的名称属性

    我有表单字段 表单 项目 这将呈现为
  • 数据类型映射参数中的键只能使用列名

    我已经使用 dask read sql table 从 Oracle 数据库成功引入了一张表 但是 当我尝试引入另一个表时 出现此错误KeyError 只有列名可以用作数据类型映射参数中的键 我已经检查了我的连接字符串和架构 所有这些都很好
  • 转换为日期格式 dd/mm/yyyy

    我有以下日期 2010 04 19 18 31 27 我想将此日期转换为日 月 年 format 您可以使用正则表达式或一些手动字符串摆弄 但我想我更喜欢 date d m Y strtotime str
  • keras自定义损失纯python(没有keras后端)

    我目前正在编写一个用于图像压缩的自动编码器 我想使用用纯 python 编写的自定义损失函数 即不使用 keras 后端函数 这是否可能 如果可能的话 如何实现 如果可能的话 我将非常感谢您提供一个最小工作示例 MWE 请查看这个 MWE
  • AWS CloudFormation:在嵌套堆栈之间传递值

    更多 AWS 问题 好的 我们的想法是一个主模板调用所有嵌套堆栈 在此处的帮助下 我弄清楚了如何将参数从主服务器传递到嵌套堆栈 现在我试图弄清楚如何将值从嵌套堆栈传递到嵌套堆栈 我认为这应该通过出口和进口来完成 但我认为我的做法不太正确 我
  • Cesium JS 椭球切平面计算

    Problem 我对铯如何计算大地测量和地心表面法线有点困惑 根据计算法线生成的平面实际上并不与给定点的椭球面相切 而且 根据大地表面法线创建的平面与根据地心表面法线生成的平面完全相同 示例以及为什么我需要这个 In this 沙堡 htt
  • 使用关键字参数 end=' ' 获取 print 的语法错误

    我有这个 python 脚本需要运行gdal retile py 但我在这一行得到一个例外 if Verbose print Building internam Index for d tile s len inputTiles end T
  • Oracle 的 DBMS_ASSERT 的 Sql Server 等效项是什么?

    数据库管理系统 断言是Oracle中防止SQL注入攻击的关键之一 我尝试了粗略搜索 是否有 SQL Server 2005 2008 等效于此功能 我正在寻找一个特定的实现 它具有 DBMS ASSERT 的所有相应 Oracle 包成员的
  • 如何使用 symfony dom 爬虫将 html 表解析为数组

    我有 html 表 我想从该表创建数组 html table tr td satu td td dua td tr tr td tiga td td empat td tr table 我的数组必须是这样的 array array satu
  • SAPI 或(文本到语音)的同步问题....... C#

    我正在开发一个项目 它将讲述浏览网页的内容 浏览器是我使用 WebControl 制作的 我正在使用 SAPI 作为语音引擎 我想在通过 SpVoice speak 阅读该内容时突出显示网页中的该行 但问题是 如果我以异步方式使用此发言方法
  • 对于已授予所有权限的用户,CREATE 命令被拒绝

    我正在尝试设置 MySQL 复制从属服务器 但运行起来非常困难LOAD DATA FROM MASTER 是的 我知道它已被弃用 但我正在运行 MySQL 5 1 目前这不是我的问题 由于某种原因 MySQL 不断告诉我CREATE命令被拒
  • 如何从 R apply 函数访问全局/外部范围变量?

    我似乎无法使 apply 函数访问 修改在外部声明的变量 给出了什么 x data frame age c 11 12 13 weight c 100 105 110 x testme lt function df i lt 0 apply
  • “类模板已被声明为非类模板”

    嘿我明白了当我离开时出现奇怪的错误namespace sf 后面代码中的声明 1 gt c libraries and headers sfml sfml 1 6 sdk windows vc2008 sfml 1 6 include sf
  • 如何设置本地文件的背景图片url?

    我想将相对图像 url 粘贴到 div 以将其设置为背景图像 不幸的是 div 不会渲染图像 所以这工作正常并渲染图像 img src assets images HeroImg jpg 但这个没有 div style background
  • 如何使用 Angular 2 路由器重新加载当前路由

    我正在使用 Angular 2hashlocation战略 该组件通过该路由加载 departments id employees 到目前为止还好 在成功批量保存多个已编辑的表行后 我想通过以下方式重新加载当前路由 URL this rou
  • 为没有 Cydia 的越狱 iPhone 分发未签名的应用程序 iPhone

    我正在尝试通过 itms services 协议为没有 CYDIA 的越狱设备分发未签名的 ipa 我浏览了有关如何为 cydia 创建未签名应用程序的指南 http www alexwhittemore com developing ja
  • 没有 async void 的即发即忘

    我有三种方法 其中第一个结果将在接下来的两个方法中使用 并且预计不会返回任何数据 result await DataAccess Query param Query await DataAccess Create result await
  • 关于 Oracle 12c 中的用户

    我的系统上安装了 Oracle 12c 数据库 我有一个需要访问数据库的应用程序 以前在Oracle 11g中 我使用以下命令来创建用户 create user name identified by name grant connect c
  • 使用 HealthKit 后台传递检索步骤后,在后台将数据写入 Firebase

    我有一个HKObserverQuery设置在后台获取步骤 enableBackgroundDelivery方法被调用在application didFinishLaunchingWithOptions 这些步骤是在后台检索的 但我还想将检索