当前位置: 首页 > 软件库 > iOS代码库 > 其他(Others) >

StepRecorder

锻炼数据记录工具
授权协议 未知
开发语言 Swift
所属分类 iOS代码库、 其他(Others)
软件类型 开源软件
地区 国产
投 递 者 长孙泉
操作系统 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 的类了。

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

 相关资料
  • 这一章我们会讲到怎么更有效地学习Vim,不过在此之前需要先做一些小小的准备。 让我们先创建一个mapping,这个mapping会为你的左手减轻很多负担。执行下面的命令: :::vim :inoremap jk <esc> ok,现在进入插入模式然后敲击jk。Vim会返回到常用模式,就像你敲击了escape按键一样。 在Vim中有很多默认的方式可以退出插入模式: <esc> <c-c> <c-[

  • 问题内容: 我正在遍历Go语言之旅中的练习,但遇到了我无法弄清的障碍。我在做这个错误: 这是我的代码: 对于我一生,我找不到问题! 问题答案: 切片 对于字符串,数组,指向数组的指针或切片a,主表达式 a [低:高] 构造一个子字符串或切片。索引表达式low和high选择哪些元素出现在结果中。结果的索引从0开始,长度等于高-低。 对于数组或字符串,索引low和high必须满足0 <= low <=

  • DELETE命令用于从Cassandra表中删除数据。 您可以使用此命令删除完整的表或选定的行。 语法: 下面举个例子来演示如何从Cassandra表中删除数据。 我们有一个名为“”的表其中列(,, ),这个表中具有以下数据。 删除整行 要删除为的整行记录,请使用以下命令: 在执行上面语句之后,为 的行记录已被删除。 您可以使用SELECT命令验证它。 删除一个特定的列名 示例: 删除为的记录中的

  • 问题内容: 我已经开始在一个拥有数以百计的表和视图的数据库的地方工作,所有这些表和视图都具有隐秘的名称,只有很少的元音,并且没有文档。它们也不允许对数据库架构进行无谓的更改,我也不能触摸任何数据库,除非要在我自己的计算机上进行测试(该数据库会被删除并定期重新创建),因此我无法添加对任何人都有用的注释。 我尝试使用“ Toad”创建一个ER图,但是连续运行48小时后,它仍然看不到任何可见的东西,我需

  • 问题内容: 我正在寻找一种让python记录器模块登录数据库并在数据库关闭时回退到文件系统的方法。 所以基本上有两件事:如何让记录器记录到数据库,以及当数据库关闭时如何使记录器记录到文件中。 问题答案: 给自己编写一个将日志定向到相关数据库的 处理程序 。当它失败时,您可以将其从记录器的处理程序列表中删除。有许多方法可以处理故障模式。

  • 尝试站点parse.com将数据加载到数据库中 类DBHelper扩展了SQLiteOpenHelper{ 在模拟器上获取 java.lang.IllegalStateExcema:尝试重新打开已关闭的对象:SQLiteDatabase: /data/data/com.project.test/databases/myDBandroid.database.sqlite.SQLiteClosable