不知道你身边有没有这样的朋友,为了霸占「微信运动」的封面,成为冠军,每天都在疯狂走路,坚持运动,甚至有将计步器捆在狗身上而几天都占领第一的新闻。于是,全民走路健身的风潮开始盛行,不止是自己,帮助家人一起记录每天锻炼的数据,了解自己的身体状况,拥有健康的身体,都是很有意义的。
可是如果使用的是老式机械计步器,或是旧款的 iPhone 手机,如何才能将锻炼数据同步到手机自带的 Health 应用上呢?
最近就有一款在微信上很火的与计步相关的 iOS 应用—— StepRecorder ,它能让使用机械计步器和旧款 iPhone 的人都能够将数据同步到 Health 上,让你再也不用担心记录不了自己和家里人的锻炼数据了。
而且,这个应用已经开源了,方便广大有兴趣的 iOS 开发者使用。
地址是:https://gitcafe.com/Hexlink/StepRecorder
这个项目使用 swift 语言,旨在帮助家人记录锻炼数据。
先上最终的效果图:
界面和功能简单清爽,只要输入计步器上显示的步数, APP 就会将数据自动同步到 Health 里,数据还可以被「微信运动」读取哟。
这款项目在刚开始小范围给朋友测试的时候,很容易被朋友们恶作剧用来刷榜发小广告,感兴趣的可以测试下「微信运动」的步数极限,但还是希望大家正确地使用这个工具。
下面简单介绍下开发流程。
创建项目,选择: Tabbed based Application ,项目的语言中选择 Swift:
打开项目后,先删除一些多余文件,比如 FirstViewController.swift 、 SecondViewController.swift 等。
打开 storyboard 看到之中有一个 Tab Bar Controller ,这是程序的根视图控制器,右键点击控制器就能看到它绑定的其它视图控制器。
如果用代码的方式初始化 UI ,可以新建一个 HHRootViewController 类来绑定根视图控制器。
首先需要有 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 ,和 objective-C 并没有什么太大的区别,稍微值得看的一些地方:
以上希望能帮助一下大家成功开发出自己的计步神器。
好连团队
GitCafe ID : Hexlink
个人主页: https://gitcafe.com/Hexlink
专注于连通人、电视大屏及移动互联网的大屏智能化基础设施开发,产品是「好连遥控」 APP 以及面向开发者的好连 SDK 。通过好连遥控不仅可以把触摸的体验搬上电视,还能将移动互联网完善的生态,如支付、社交分享等引入电视。让电视用户获得更好的体验的同时,也能帮助开发者更好地在电视上开发、移植和发布应用。
了解更多关于好连遥控 ,请访问: www.hihex.com/download , 加入好连或成为好连开发者,请联系 [email protected] 。
欢迎对这个 iOS 项目感兴趣的朋友试用~~