V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
irisgyq
V2EX  ›  iOS

微信上超火的计步神器 iOS 版本在 GitCafe 上开源了!

  •  
  •   irisgyq · 2015-08-21 12:03:17 +08:00 · 3571 次点击
    这是一个创建于 3383 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道你身边有没有这样的朋友,为了霸占「微信运动」的封面,成为冠军,每天都在疯狂走路,坚持运动,甚至有将计步器捆在狗身上而几天都占领第一的新闻。于是,全民走路健身的风潮开始盛行,不止是自己,帮助家人一起记录每天锻炼的数据,了解自己的身体状况,拥有健康的身体,都是很有意义的。

    可是如果使用的是老式机械计步器,或是旧款的 iPhone 手机,如何才能将锻炼数据同步到手机自带的 Health 应用上呢?

    最近就有一款在微信上很火的与计步相关的 iOS 应用—— StepRecorder ,它能让使用机械计步器和旧款 iPhone 的人都能够将数据同步到 Health 上,让你再也不用担心记录不了自己和家里人的锻炼数据了。

    而且,这个应用已经开源了,方便广大有兴趣的 iOS 开发者使用。

    地址是:https://gitcafe.com/Hexlink/StepRecorder

    计步神器·StepRecorder (iOS )

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

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

    关于作者

    好连团队
    GitCafe ID : Hexlink
    个人主页: https://gitcafe.com/Hexlink

    专注于连通人、电视大屏及移动互联网的大屏智能化基础设施开发,产品是「好连遥控」 APP 以及面向开发者的好连 SDK 。通过好连遥控不仅可以把触摸的体验搬上电视,还能将移动互联网完善的生态,如支付、社交分享等引入电视。让电视用户获得更好的体验的同时,也能帮助开发者更好地在电视上开发、移植和发布应用。

    了解更多关于好连遥控 ,请访问: www.hihex.com/download , 加入好连或成为好连开发者,请联系 [email protected]

    欢迎对这个 iOS 项目感兴趣的朋友试用~~

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6046 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:46 · PVG 10:46 · LAX 18:46 · JFK 21:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.