Watch OS2 - Healthkit的sdk接入
博主于今年7月底开始接触watch os2.0系统,听闻在os2.0上已经支持了原生app的开发,便兴致冲冲的开始了一段漫长的爬坑之旅!
博主主要开发的项目是在watch上研发一款健身宠物养成类游戏,如下图:
主要的功能就是利用watch os2.0 上的healkit sdk,依据watch收集的个人健康数据,以及完成这款原生app(即健身宠物,后文如此称呼)所指定的锻炼任务后,可以获得锻炼宠物的活力,以及捕捉相应各种种类的宠物等。而你所圈养的宠物的进化,也会依据主人的锻炼成果而有所不同,分为肌肉型,智慧型,以及肥胖型。
因此由上述功能可知,开发这款健身宠物,其核心模块就是apple watch上的healthkit sdk。
博主开发的时候,使用的开发环境是Xcode 7.0 beta 5 ,watch os 2.0 以及 ios 9.0。
好了,言归正传,下面就来讲述下博主在搭建项目阶段遇到的第一个坑,既是Healkit的sdk接入,所会遇见的最主要的问题。
首先,要导入apple提供的healthkit的sdk,你需要在你的项目工程文件中的target下,找到ios targets以及watchkit extensition的Capabilities目录,打开这两者中的healthkit开关。具体位置如下图所示:
在打开了项目设置里的ios 以及 watchkit extensition的healkit 开关后,我们将要进行下一步操作——请求healthkit 数据读取的授权。网上有很多类似的使用案例,在此我也将我的使用方法贴出来,这里不是重点,随后在appDelegate.swift中的设置才是重点。
import WatchKit import Foundation import HealthKit import ClockKit class ExtensionDelegate: NSObject, WKExtensionDelegate{ let healthManager = HealthManager() let userDefault = NSUserDefaults.standardUserDefaults() let gameData = GameData.shareInstance() let csvReader = CSVReaderSingleton.shareInstance() func applicationDidFinishLaunching() { // Perform any final initialization of your application. initData() gameData.configData = GameData.getConfigDataFromCSV(9000) if !userDefault.boolForKey("firstLogin") { firstInit() gameData.setUserData() } gameData.getUserData() } func applicationDidBecomeActive() { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. gameData.getUserData() gameData.startBenefitTimer() gameData.checkPetReward() gameData.checkFatAdding() gameData.checkHealthReward() gameData.startWorkSession() } func applicationWillResignActive() { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, etc. gameData.setUserData() gameData.closeBenefitTimer() gameData.endWorkSession() // refreshComplications() } func didReceiveLocalNotification(notification: UILocalNotification) { } func firstInit() { // --- 标示用户是否为首次登陆 userDefault.setBool(true, forKey: "firstLogin") gameData.currentPetData.id = gameData.configData.defaultPet gameData.currentPlayerData.storeItemUsing = gameData.configData.defaultTrain gameData.currentPlayerData.storeItemPurchased.append(gameData.configData.defaultTrain) } func initData() { // --- 初始化csv数据 csvReader.initDictionaryData() // --- 请求healthkit授权 print("start request authorize") healthManager.authorizeHealthKit { (authorized, error) -> Void in if authorized { print("HealthKit authorization received.") } else{ print("HealthKit authorization denied!") if error != nil { print("\(error)") } } } } func refreshComplications() { let clockServer = CLKComplicationServer.sharedInstance() for complication in clockServer.activeComplications { if complication.family == .ModularLarge { // refresh the complication datas clockServer.extendTimelineForComplication(complication) } } } }
在watchkit Extensition上获取了授权后(即watch取得授权),还需要向手机进行一次healthkit的授权验证(无法避免)。这就是很多人容易忽略掉的一步,缺少了这一步,apple watch是无法获得healthkit中心的数据的。因此,我们需要在ios的工程中的AppDelegate.swift中加入如下一句话:(如图)
在此处对手机进行授权访问验证后,才能使apple watch 的healthkit 数据授权成功。
好了,第一篇主要是将healthkit的接入,下一篇博客,博主将具体介绍如何实现 心跳数据的读取,以及脉搏跳动动画,并分享一下apple watch上按小时分钟获取healthkit step数据的所遇到的大坑,以及如何填补这个坑。