StepRecorder锻炼数据记录工具
这个项目使用 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 的类了。
以上希望能帮助一下大家成功开发出自己的计步神器。