iOS HealthKit 今天的步数始终为 0(但尾随天数没问题)

2024-05-22

在我们的应用程序中,我们查询 HealthKit 以获取过去 7 天的步数,每天汇总,以午夜为基准。所以范围是 D-6 午夜到明天午夜(因为我们想要今天的步骤到现在为止)。

它有效,我们总是能够获取过去 6 天的数据,除了今天的数据始终为 0。

但奇怪的是,如果我们随后打开 iOS 8.0 附带的默认 iHealth 应用程序,它会计算健康数据并在图表中显示今天的步骤。然后,如果我们重新打开应用程序并重新加载图表数据,今天的步骤就会奇迹般地出现,与“iHealth”显示的内容相符。

那么 iPhone 是否会仅在午夜自动生成每日步数,并将其缓存起来还是其他什么?我们是否需要单独调用才能计算today's在检索任何健康指标之前的数据或其他内容?

这是我们调用来获取数据的函数:

func queryDailyStats(metric: NSString!, handler: ([NSDate: Int] -> Void)!) {
    let quantityType = HKObjectType.quantityTypeForIdentifier(metric)
    let calendar = NSCalendar.currentCalendar()
    let now = NSDate()
    let preservedComponents: NSCalendarUnit = (.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay)
    let midnight: NSDate! = calendar.dateFromComponents(calendar.components(preservedComponents, fromDate:now))
    let dailyInterval = NSDateComponents()
    dailyInterval.day = 1

    let tomorrow = calendar.dateByAddingUnit(.MonthCalendarUnit, value: 1, toDate: midnight, options: nil)
    let oneMonthAgo = calendar.dateByAddingUnit(.MonthCalendarUnit, value: -1, toDate: midnight, options: nil)
    let oneWeekAgo = calendar.dateByAddingUnit(.DayCalendarUnit, value: -6, toDate: midnight, options: nil) // only need to start from 6 days back

    // need tomorrow's midnight as end date to get all of today's data
    let predicate = HKQuery.predicateForSamplesWithStartDate(oneWeekAgo, endDate: tomorrow, options: .None)

    let query = HKStatisticsCollectionQuery(
        quantityType: quantityType,
        quantitySamplePredicate: predicate,
        options: .CumulativeSum,
        anchorDate: midnight,
        intervalComponents: dailyInterval
    )

    query.initialResultsHandler = { query, results, error -> Void in
        var data:[NSDate: Int] = [:]
        if error != nil {
            println(error)
        } else {
            results.enumerateStatisticsFromDate(oneWeekAgo, toDate: midnight) { statistics, stop in
                if let quantity = statistics.sumQuantity() {
                    let date = statistics.startDate
                    let value = Int(quantity.doubleValueForUnit(HKUnit.countUnit()))

                    data[date] = value
                }
            }
        }

        handler(data)
    }

    self.healthKitStore.executeQuery(query)
}

如果您只需要当前或最近的步数和距离数据,则应使用 Core Motion CMPedometer 类而不是 HealthKit。界面更加简单,数据返回快速准确。我遇到了同样的问题,并改用 Core Motion 方法来解决它。

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

iOS HealthKit 今天的步数始终为 0(但尾随天数没问题) 的相关文章

随机推荐

  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开
  • Ruby:如何编写 gem? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想为 Ruby 编写一个包并将其作为 gem 提供 有哪些工具 步骤和陷阱 有没有好的教程 截屏视频等
  • 迁移现有的 Spring Websocket 处理程序以使用 rsocket

    假设我有一个用于聊天消息的简单 Websocket 处理程序 Override public Mono
  • 为什么处置/关闭 WCF 客户端代理很重要

    我听说即使在以下情况下也必须处置 或关闭 WCF 客户端代理 你没有使用会话 没有需要确定性清理的非托管资源 例如打开的套接字 例如 当使用具有默认绑定配置的 BasicHttpBinding 时 即使在流行的网页中也应该没问题 对吧 va
  • Gulp 不会看到任何变化

    我正在绞尽脑汁 但似乎无法弄清楚下面的 gulpfile 有什么问题 它只是监视和编译 less 文件 这根本不会少看变化 我已经尝试了所有gulp gulp watch 每次更改后我都必须手动运行 gulp 来编译它们 是否有什么问题导致
  • 重载 std::bitset 的移位运算符

    我想使用移位运算符进行位旋转instead他们的实际位移 这是我的预期行为 std bitset lt 8 gt b8 1010 b8 00001010 b8 lt lt 5 b8 01000001 所以我尝试超载 lt lt 运算符 引用
  • Robot Framework - 访客界面 - 如何获取关键字的子关键字?

    实施机器人后套件访客界面 https robot framework readthedocs io en 3 0 autodoc robot model html robot model visitor SuiteVisitor功能def
  • 非图形三向合并工具

    我目前使用 RCS 的合并命令进行 3 路合并 但有一件事一直让我烦恼 如果我使用 A选项 两个文件中所做的相同更改显示为冲突 lt lt lt lt lt lt lt file1 file1 line 1 orig orig line 1
  • 服务、控制器、提供者命名约定

    随着我职业生涯的成长 我认为命名约定非常重要 我注意到人们乱扔控制器 LibraryController 服务 LibraryService 和提供者 LibraryProvider并在某种程度上可以互换使用它们 使用其中一种与另一种有什么
  • SpringMVC - Hibernate:java.base/[Ljava.lang.Object;无法投射到

    组 java package com keating model import com fasterxml jackson databind annotation JsonSerialize import org hibernate ann
  • 以编程方式生成渐变?

    给定 2 个 RGB 颜色和一个矩形区域 我想在颜色之间生成基本的线性渐变 我进行了快速搜索 我唯一能找到的是这个博客条目 http jtauber com blog 2008 05 18 creating gradients progra
  • Flutter- GestureDetector 检测水平和垂直拖动的方向

    我在用GestureDetector并没有找到任何onXYZ告诉您拖动方向的事件 你试过了吗onPanUpdate details 方法 以下是您可以如何做到这一点 GestureDetector onPanUpdate details i
  • 拒绝对先前失败的类 java.lang.Class supportLib=28 重新初始化

    当我切换到 supportLibrary 28 时 这个奇怪的 logcat 消息开始出现 但在 27 1 1 上却没有出现 我尝试使用一个空的默认项目 结果完全相同 该问题很容易重现 创建一个包含空活动的新项目 并在除 API28 模拟器
  • 如何忽略 perl 中的“证书验证失败”错误?

    我想访问一个无法验证证书的网站 我正在使用 WWW Mechanize 获取请求 那么如何忽略这一点并继续连接到该网站呢 use IO Socket SSL qw use WWW Mechanize qw my mech WWW Mecha
  • Rails 生产“CSS 未预编译”

    我已经在我的 Leopard 网络服务器上使用生产环境在姊妹 Rails 3 1 应用程序上完成了此操作 所以我没想到部署这个应用程序会如此失败 我已经让 Passenger 识别出该应用程序 但我在 apache 中收到 GET miss
  • ASP.NET MVC 开源真实世界应用程序 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 每当我开始学习新技术或语言时 我倾向于查看一些 现实世界 应用程序的源代码 我发现它们对于理解常见的
  • .NET 中非常奇怪的 SSL 错误:仅针对特定 URL 无法解密指定数据

    我正在使用 NET 从 URL 下载数据 对于大多数 URL 它都没有问题 但对于一个特定的 URL 当我尝试建立连接时 我收到一个非常奇怪的错误 此外 该错误仅在第二次 及后续 尝试发出请求时发生 第一次似乎总是有效 这是一些演示该问题的
  • 如何在 bash 上运行 MySQL 命令?

    以下代码在命令行上运行 mysql user myusername password mypassword database mydatabase execute DROP DATABASE myusername CREATE DATABA
  • SSLHandshakeException:证书中的主机名不匹配

    我正在编写一个系统 必须向具有自签名证书的服务器 一个名为 ARX 的第三方程序 当前在开发过程中在本地主机上运行 进行多部分发布 我试图找到它的证书 但只能找到三个不同的jks文件 服务器 jks 服务器信任 jks and 服务器ca
  • iOS HealthKit 今天的步数始终为 0(但尾随天数没问题)

    在我们的应用程序中 我们查询 HealthKit 以获取过去 7 天的步数 每天汇总 以午夜为基准 所以范围是 D 6 午夜到明天午夜 因为我们想要今天的步骤到现在为止 它有效 我们总是能够获取过去 6 天的数据 除了今天的数据始终为 0