StepRecorder - 锻炼数据记录工具


未知
iOS
Swift

软件简介

这个项目使用 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 的类了。

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