StepRecorder锻炼数据记录工具

联合创作 · 2023-09-27 15:07

这个项目使用 swift 语言,旨在帮助家人记录锻炼数据。

先上最终的效果图:

界面和功能简单清爽,只要输入计步器上显示的步数,APP 就会将数据自动同步到 Health 里,数据还可以被「微信运动」读取哟。

这款项目在刚开始小范围给朋友测试的时候,很容易被朋友们恶作剧用来刷榜发小广告,感兴趣的可以测试下「微信运动」的步数极限,但还是希望大家正确地使用这个工具。

下面简单介绍下开发流程。

项目设置

1. 创建项目,选择: Tabbed based Application,项目的语言中选择 Swift:

2. 打开项目后,先删除一些多余文件,比如 FirstViewController.swift、SecondViewController.swift 等。

3. 打开 storyboard 看到之中有一个 Tab Bar Controller,这是程序的根视图控制器,右键点击控制器就能看到它绑定的其它视图控制器。

4. 如果用代码的方式初始化 UI,可以新建一个HHRootViewController 类来绑定根视图控制器。

HealthKit 的实现

首先需要有 apple 的开发者账号(可以参考网上的注册教程),打开 HealthKit Capabilities ,才能在 iOS 的健康 APP 中添加数据或者读取信息。

接 下来写一个 HealthManager 类用来处理所有项目中涉及到和 HealthKit 相关的东西。Let healthKitStore:HKHealthStore = HKHealthStore() 由于苹果的隐私政策,先申请权限,这个变量的调用方法可以获取健康信息和读取信息

申请权限

func authorizeHealthKit(completion: ((success:Bool, error:NSError!) -> Void)!)

  {         //1

      let healthKitTypesToWrite: Set = [

          HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount),

      ]

     //2

      if !HKHealthStore.isHealthDataAvailable() {             let error = NSError(domain: "com.hihex.healthkit", code: 2, userInfo:

[NSLocalizedDescriptionKey:"HealthKit is not available in this Device"])

          if completion != nil {

              completion(success:false, error:error)

          }             return;

      }

   //3

      healthKitStore.requestAuthorizationToShareTypes(healthKitTypesToWrite, readTypes: nil) { (success, error) -> Void in

          if completion != nil {

              completion(success:success,error:error)             }

      }

  }


写上需要申请的权限集合,因为 APP 内读取自己写入的数据不需要读取的权限所以就不申请读取的权限。

检查设备是否能获取到健康的信息,因为有些机型如 iPad 等并不能支持 HealthKit 。

申请权限,因为传入的是一个块你可以根据处理的结果进行 UI 上的交互。

HealthKit支持的活动的类型有70多种,可以在 HKWorkoutActivityType 里查看,有兴趣可以自己看看。

保存运动样本

func saveStepsSample( steps: Double, endDate: NSDate , duration :Int, completion: ( (Bool, NSError!) -

> Void)!) {         //1

      let sampleType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)

      let stepsQuantity = HKQuantity(unit: HKUnit.countUnit(), doubleValue: steps)         let startDate = endDate.dateByAddingTimeInterval(0 - 60 * Double(duration))

     //2         let stepsSample = HKQuantitySample(type:

HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount), quantity: stepsQuantity,

startDate: startDate, endDate: endDate)

      //3

      self.healthKitStore.saveObject(stepsSample, withCompletion: { (success, error) -> Void in

          completion(success,error)

      })

  }

在一个运动的样本中,先把各项要使用的数据初始化:运动样本的类型、计算的单位、开始以及结束时间、生成运动的样本、 在 HealthKit 中保存样本。

读取运动样本

func readStepsWorksout(limit :Int,completion: (([AnyObject]!, NSError!) -> Void)!) {

      //1

      let sampleType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)         let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false)

      let predicate = HKQuery.predicateForObjectsFromSource(HKSource.defaultSource())

     //2

      let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: limit,

sortDescriptors: [sortDescriptor])

          { (sampleQuery, results, error ) -> Void in

              if let queryError = error {

                  println( "There was an error while reading the samples: \

(queryError.localizedDescription)")

              }

              completion(results,error)

      }

      healthKitStore.executeQuery(sampleQuery)     }

为需要查询的条件赋值:样本类型,排序要求,数据源筛选。

使用 HealthKit 的方法进行查询,返回的结果在 result 中,返回的是样本的数组。

至此, HealthKit 这块的内容都完成了。

其它 UI

接下来就是 UI,和 objective-C 并没有什么太大的区别,稍微值得看的一些地方:

  • 在实现运动时长设定的时候自定义的一个 UIPickerView。(HHAddStepsViewController.swift)

  • 项目中对 NSDate 的处理以及格式化文本。(HHAddStepsViewController.swift)

  • tableview 设置自己想贴上 FirstResponderView。(HHAddStepsViewController.swift)

  • 加载本地网页和拉取更新服务器上的网页。(HHRootViewController.swift & HHAboutViewController.swift)

  • 拿到数据样本之后在 tableview 中的显示。(HHHistoryViewController.Swift )

  • Swift 支持 Objective-C 代码

  • 项目的最后加上了谷歌分析的代码,首先新建一个头文件命名的时候按照如下格式 ProjectName-Bridging-Header.h,在头文件中 #import 所以你需要的Objective-C 头文件。然后选中 Target 选择 build settings,搜索 Swift 找到 objective -c bridging-header 然后填上你写的头文件的路径。最后你就可以用 Swift 文件中调用 Objective-C 的类了。

以上希望能帮助一下大家成功开发出自己的计步神器。

浏览 4
点赞
评论
收藏
分享

手机扫一扫分享

编辑
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑
举报