日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > iOS中 HeathKit框架學習 步數統計等 韓俊強的博客

iOS中 HeathKit框架學習 步數統計等 韓俊強的博客

來源:程序員人生   發布時間:2016-11-05 08:38:20 閱讀次數:3493次

逐日更新關注:http://weibo.com/hanjunqiang  新浪微博!iOS開發者交換QQ群: 446310206

HeathKit框架學習

本文結構
  • 簡介
  • 用戶數據安全及隱私
  • HeathKit框架
  • HeathKit使用
  • 總結

簡介

HeathKit是Apple公司在推出iOS 8 系統時1塊推出的關于健康信息的框架。如果iPhone手機系統升級到iOS8以后就會發現多了1個健康-app,這就是Apple提供的1個記錄用戶健康信息的app,可以用它來分享健康和健身數據。還可以指定數據的來源,比如我們自己創建1個app,在我們的app中使用了HeathKit框架以后只要經過用戶的認證,就能夠在我們的app當中給健康分享數據或從健康中獲得數據。

HeathKit可以與健身裝備1起工作,iPhone手機本身可以監控步數信息,會自動導入步數信息。但是其他信息或裝備需要配套的應當才能獲得到數據并導入到HeathKit中并在健康中顯示。

HeathKit不能再iPad中使用,而且它也不支持擴大。

用戶數據安全及隱私

由于用戶的健康信息多是敏感的,所以這些用戶信息不能讓開發者很隨意的獲得到。每條信息的讀寫都需要用戶去選擇是不是同意,比如用戶可以同意你獲得到用戶的身高體重,但是不同意讀寫生殖健康等其他用戶不愿意公然的信息。為了避免信息泄漏,我們是不知道用戶是不是制止了某條信息是不是被用戶制止讀取的。簡單的說,如果獲得不到某條信息,就代表沒有這條信息。

關于更多的關于隱私的信息,可以參考隱私

HeathKit框架

HeathKit在各個利用之間提供了1種成心義的方式同享數據。因此,我們必須使用HeathKit框架提供的數據類型和單位。這保證了數據存在的真正意義,我們不能自定義數據類型及單位。框架使用了子類化,例如HKObjectHKObjectType抽象類具有很多有平行關系的子類,當使用ObjectObjectType的時候,必須確保使用正確的子類。

HeathKit中能夠存儲的類都是HKObject的子類,大部份HKObject的子類都是不可變的。每一個對象都有下面的屬性:

  • UUID:每一個對象的標識符
  • Source:數據的來源,來源可以是HeathKit的健康app,也能夠是我們自己創建的app。當1個對象存儲到HeathKit中時會設置其來源。只有從HeathKit中獲得到的數據的來源才有效。
  • Metadata:1個包括該對象額外信息的字典,元數據包括預定義的key和自定義的key,預定義的key用來幫助我們在利用間同享數據,而自定義的key用來擴大HeathKit,為對象添加針對利用的數據。

HeathKit的對象主要分為特點和樣本。特點對象代表用戶的基本不變的數據,包括用戶的生日、血型和性別等。我們創建的app不能修改這些信息,只能讓用戶在健康中去修改或添加個人特點信息。
樣本對象代表某個特定時間的數據,所有的樣本類型的對象都是HKSample的子類。它們都有下面的特性:

  • Type :樣本類型,例如:睡眠分享、步行距離、心率樣本等
  • StartDate:樣本開始時間
  • EndDate:樣本結束時間。如果是某1個時間的樣本,則開始于結束時間相同,如果是某個時間段的樣本,則結束時間在開始時間的后面。

樣本類型又可以分為4個類型:

  1. 種別樣本(HKCategorySample):在iOS 8 中,只有睡眠分析這1個種別樣本。代表有限種類的樣本.
  2. 數量樣本(HKQuantitySample):這類樣本代表存儲數據的樣本,比如步數、距離、用戶的體溫等。它是HeathKit中最多見的數據類型。
  3. 關系樣本(HKCorrelation):代表復合數據,包括1個或多個樣本。在iOS 8 中,用correlation代表食品和血壓。在創建食品或血壓時,需要用correlation
  4. 訓練活動(HKWorkout):代表某種活動,比如走、跑步等。包括有開始時間、結束時間、運動類型、消耗能量、運動距離等屬性。還可以為workout關聯許多詳細的樣本。不像correlation,這些樣本不包括在workout中,但是可以通過workout獲得到。

再介紹1個HeathKit中常常用到的1些類。

HKSamle

每一個HkSample的子類都有對應的便利方法創建對應的對象。比如:

對數量樣本,需要創建HKQuantity類的實例。而且數量的單位和類型標識符文檔中描寫的可用單位要相同。例如:HKQuantityTypeIdentifierHeight 文檔中說明它使用長度單位,因此,你的數量必須使用厘米、米、英尺、英寸或其他長度單位。

這里寫圖片描述

對應種別樣本,需要創建HKCategorySample的實例。它的值必須和類型標識符文檔中描寫的枚舉值相干。例如, HKCategoryTypeIdentifierSleepAnalysis 文檔中說明它使用的枚舉值。因此你在創建樣本時必須從這個枚舉中傳遞1個值。
這里寫圖片描述

一樣,你必須先創建correlation包括的所有樣本。correlation的類型標識符描寫了它可以包括的類型和對象的數量。不要把被包括的對象存進HealthKit。它們是以correlation的1部份存儲的。

逐日更新關注:http://weibo.com/hanjunqiang  新浪微博!iOS開發者交換QQ群: 446310206

這里寫圖片描述

對訓練活動樣本,首先,創建 HKWorkoutType 實例其實不需要指定類型標識符。所有的workout都是用一樣的類型標識符。第2,對每一個workout你都需要提供1個 HKWorkoutActivityType 值。這個值定義了workout中履行的活動的類型。最后,當workout保存到HealthKit后,你可以給workout關聯額外的樣本。這些樣本提供了workout的詳細信息。

這里寫圖片描述

HKQuery

HeathKit提供了許多查詢讀取數據的方法:

  1. 直接方法查詢。對特點樣本,可以直接查詢獲得到,這些方法只能查詢特點樣本。更多信息: HKHealthStore Class Reference
  2. 樣本查詢。這是使用最多的查詢。使用樣本查詢可以查詢在HeathKit中任意的數據。而且可以對結果進行排序等。更多信息:HKSampleQuery Class Reference

  3. 視察者查詢。這是1個長時間運行的查詢,它會檢測HealthKit存儲,并在匹配到的樣本產生變化時通知你。如果當存儲產生變化時你想得到通知,就使用視察者查詢。更多信息:HKObserverQuery Class Reference

  4. 錨定對象查詢。用這類查詢來搜索添加進存儲的項。當錨定查詢第1次履行時,會返回存儲中所有匹配的樣本。在接下來的履行中,只會返回上1次履行以后添加的項目。通常,錨定對象查詢會和視察者查詢1起使用。視察者查詢告知你某些項目產生了變化,而錨定對象查詢來決定有哪些(如果有的話)項目被添加進了存儲。更多信息:HKAnchoredObjectQuery Class Reference
  5. 統計查詢。使用這類查詢來在1系列匹配的樣本中履行統計運算。你可使用統計查詢來計算樣本的總和、最小值、最大值或平均值。更多信息: HKStatisticsQuery Class Reference

  6. 統計集合查詢。使用這類查詢來在1系列長度固定的時間間隔中履行屢次統計查詢。通常使用這類查詢來生成圖表。查詢提供了1些簡單的方法來計算某些值,例如,每天消耗的總熱量或每5分鐘行走的步數。統計集合查詢是長時間運行的。查詢可以返回當前的統計集合,也能夠監測HealthKit存儲,并對更新做出響應。更多信息,參見 HKStatisticsCollectionQuery Class Reference。

  7. Correlation查詢。使用這類查詢來在correlation查找數據。這類查詢可以為correlation中每一個樣本類型包括獨立的謂詞。如果你只是想匹配correlation類型,那末請使用樣本查詢。更多信息,參見 HKCorrelation Class Reference。

  8. 來源查詢。使用這類查詢來查找HealthKit存儲中的匹配數據的來源(利用和裝備)。來源查詢會列出貯存的特定樣本類型的所有來源。更多信息,參見HKSourceQuery Class Reference。

  9. 逐日更新關注:http://weibo.com/hanjunqiang  新浪微博!iOS開發者交換QQ群: 446310206


HKUnit

這個類代表要查詢的數據的單位的類,比如體重的單位,可以為kg、lbs等。這個類為不同的數據類型提供了不同的單位方法。1般在創建前面介紹的樣本類型的時候,都需要這個類為樣本添加對應的單位。而且提供了1些數學運算,比如千米、米、厘米等之間的轉換。

在某些場合,你可使用格式化器來本地化數量。iOS8提供了提供了新的格式化器來處理長度(NSLengthFormatter)、質量(NSMassFormatter)和能量(NSEnergyFormatter)。對其他的數量,你需要自己來換算單位和本地化數據。

HKHeathStore

HeathKit的核心就是它,它代表HeathKit的數據庫,使用它就能夠從數據庫中讀取數據。比較重要的方法:

  • isHealthDataAvailable:判斷當前設置是不是支持HeathKit
  • requestAuthorizationToShareTypes(typesToShare: Set?, readTypes typesToRead: Set?, completion: (Bool, NSError?) -> Void): 向用戶要求同意讀寫某些數據
  • saveObject(object: HKObject, withCompletion completion: (Bool, NSError?) -> Void) :向數據庫中添加數據
  • executeQuery(query: HKQuery) :履行查詢,即上面介紹的幾種查詢方法。

HeathKit使用

在使用HealthKit之前,必須要履行以下步驟:

  1. 打開HeathKit,在Target欄中,打開Capabilities菜單,將HealthKit這1項的開關設為ON的狀態。
  2. 創建HeathManager.Swift 文件,并導入

    `import HeathKit`
    

    HeathKit的核心是HeathStore,創建

    func authorizeHealthKit(completion:((success:Bool,error:NSError!)->Void)!){}
    

    然后調用在這個方法中調用isHealthDataAvailable判斷當前裝備是不是支持HeathKit

  3. //判斷當前裝備是不是支持 if !HKHealthStore.isHealthDataAvailable(){ let error = NSError(domain: "", code: 2, userInfo: [NSLocalizedDescriptionKey:"HealthKit is not available in this Device"]) if completion != nil { completion(success: false, error: error) } }


  4. ,最后在上面的方法中,設置要讀寫的數據類型。

  5. 為你的利用實例化1個 HKHealthStore 對象。每一個利用只需要1個HealthKit存儲實例。這個存儲實例就是你和HealthKit數據庫交互的主要接口。

    let hkHealthStore = HKHealthStore()
    
  6. 使用 requestAuthorizationToShareTypes:readTypes:completion:來認證要求從HeathKit獲得數據的權限。

    //要求連接 hkHealthStore.requestAuthorizationToShareTypes(healthKitTypesToWrite as? Set<HKSampleType>, readTypes: healthKitTypesToRead as? Set<HKObjectType>) { (success, error) -> Void in if completion != nil{ completion(success:success,error:error) } return }

    如果當前裝備支持HeathKit的時候,這樣就會彈出1個要求界面,讓用戶選擇是不是同意你能夠獲得到你要要求的數據。

獲得特點信息

我們首先創建了ProfileViewController.swift,并用IB創建1個要求個人信息的界面
這里寫圖片描述

然后在HeathManager.Swift 文件中添加要求個人信息的方法。
對要求特點信息,條件上用戶通過健康添加了誕生日期、性別、血型等特點信息

func readProfile()->(age:Int?,biologicalsex:HKBiologicalSexObject?,bloodType:HKBloodTypeObject?){ //要求年齡 var age:Int? let birthDay:NSDate; do { birthDay = try hkHealthStore.dateOfBirth() let today = NSDate() let diff = NSCalendar.currentCalendar().components(.Year, fromDate: birthDay, toDate: today, options: NSCalendarOptions(rawValue: 0)) age = diff.year }catch { } //要求性別 var biologicalSex :HKBiologicalSexObject? do { biologicalSex = try hkHealthStore.biologicalSex() }catch { } //要求血型 var hkbloodType:HKBloodTypeObject? do { hkbloodType = try hkHealthStore.bloodType() }catch{ } return (age,biologicalSex,hkbloodType) }


要求體重、身高、BMI的時候,創建另外的方法。

func fetchMostRecentSample(sample:HKSampleType,competion:((HKSample!,NSError!)->Void)!){ //1.創建謂詞 let past = NSDate.distantPast() let now = NSDate() let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(past, endDate: now, options: .None) //2.創建返回結果排序的描寫,是降序還是升序的,由于只需要1個結果,就設定限制為1個 let sortDescrptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate , ascending: false) let limit = 1 //3.創建HKSampleQuery對象, let sampleQuery = HKSampleQuery(sampleType: sample, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescrptor]) { (sampleQuery, results, error) -> Void in if let queryError = error { competion(nil,queryError) return } let mostRecentSample = results?.first if competion != nil{ competion(mostRecentSample,nil) } } //4.履行查詢 self.hkHealthStore.executeQuery(sampleQuery) }


獲得以后在之前創建的ProfileViewController.swift文件中獲得這些信息,并更新UI。

對應特點信息,可以直接調用查詢方法,并更新

let profile = healthManager?.readProfile() self.healthStore = HKHealthStore() ageLabel.text = profile?.age == nil ? kUnKnowString:String(profile!.age!) sexLabel.text = biologicSexLiteral(profile?.biologicalsex?.biologicalSex) bloodTypeLabel.text = bloodTypeLiteral(profile?.bloodType?.bloodType)


這里面創建了兩個工具方法biologicSexLiteralbloodTypeLiteral來修改查詢的結果為我們想要的模樣并顯示在界面上。

對體重和身高,需要創建樣本查詢

/** 獲得并更新體重 */ func updateWeight(){ let weightSampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass) self.healthManager?.fetchMostRecentSample(weightSampleType!, competion: { (mostRecentSample, error) -> Void in if error != nil { return } var weightString = self.kUnKnowString self.weight = mostRecentSample as? HKQuantitySample //根據我們想要的數據類型單位獲得對應的結果 if let kilograms = self.weight?.quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(HKMetricPrefix.Kilo)){ //體重格式化 let weightFommater = NSMassFormatter() weightFommater.forPersonMassUse = true weightString = weightFommater.stringFromKilograms(kilograms) } //由于這個查詢默許是異步查詢的,所以需要在主線程更新UI dispatch_async(dispatch_get_main_queue()) { () -> Void in self.weightLabel.text = weightString self.updateBMILabel() } }) } /** 獲得并更新身高 */ func updateHeight(){ //設置要查找的類型,根據標識符 let heightSampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight) //獲得身高樣本 self.healthManager?.fetchMostRecentSample(heightSampleType!, competion: { (heightSample, error) -> Void in if error != nil { return } var heightStr = self.kUnKnowString self.height = heightSample as? HKQuantitySample //根據我們想要的數據類型單位獲得對應的結果 if let kilograms = self.height?.quantity.doubleValueForUnit(HKUnit.meterUnit()){ heightStr = String(format: "%.2f", kilograms) + "m" } //由于這個查詢默許是異步查詢的,所以需要在主線程更新UI dispatch_async(dispatch_get_main_queue()) { () -> Void in self.heightLabel.text = heightStr self.updateBMILabel() } }) }


對應BMI,它代表人的身體質量指數,它的計算方式是:體重/(身高*身高)。因此它可以這樣取得

/** 獲得并設置BMI: */ func updateBMILabel(){ //根據我們想要的數據類型單位獲得對應的結果 let weight = self.weight?.quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(HKMetricPrefix.Kilo)) let height = self.height?.quantity.doubleValueForUnit(HKUnit.meterUnit()) var bmiValue = 0.0 if height == 0{ return } dispatch_async(dispatch_get_main_queue()) { () -> Void in bmiValue = (weight!)/(height! * height!) self.BMILabel.text = String(format: "%.02f", bmiValue) } }


添加BMI到HeathStore

在下面的方法中添加1個alertView讓用戶輸入BMI值,然后點擊確認按鈕以后添加到HeathStore

@IBAction func addBMIData2HealthStore(sender: AnyObject) { let alertView = UIAlertController(title: "輸入BMI值", message: nil, preferredStyle: .Alert) alertView.addTextFieldWithConfigurationHandler { (textField) -> Void in textField.keyboardType = .NumberPad } let action = UIAlertAction(title: "添加", style: .Default) { (action) -> Void in var value:Double? if let text = alertView.textFields?.first?.text { if text.characters.count > 0 { value = Double(text) self.saveBMI2HealthStore(value!) } } } alertView.addAction(action) self .presentViewController(alertView, animated: true, completion: nil) } //保存BMI到heathKitStore中 func saveBMI2HealthStore(height:Double){ //BMI的類型 let BMIType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex) //根據標識符對應的單位創建BMI的數量對象 let BMIQuantity = HKQuantity(unit: HKUnit.countUnit(), doubleValue: height) let now = NSDate() //根據起止時間和上面創建的創建HKQuantity對象創建數量樣本 let BMISample = HKQuantitySample(type: BMIType!, quantity: BMIQuantity, startDate: now, endDate: now) //保存數量樣本到healthStore中 self.healthStore?.saveObject(BMISample, withCompletion: { (success, error) -> Void in if success { print("添加成功") self.updateWeight() } if (error != nil) { print("添加失敗") } }) }


如果添加成功,你就能夠去手機上的健康查找BMI,就能夠看到我們剛才添加的BMI值,而且它的來源是我們創建的app。

獲得HKWorkout

創建1個WorkOutsViewController.swift文件,并在SB中拖對應的IB文件,界面以下
這里寫圖片描述

然后在在HeathManager.Swift 文件中添加要求workout的方法

/** 獲得workoutData */ func fetchWorkOutsData(completion:([AnyObject]!,NSError!)->Void){ let workOutsSampleType = HKSampleType.workoutType() let workOutsPredicate = HKQuery.predicateForWorkoutsWithWorkoutActivityType(.Running) let sortDescrptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate , ascending: false) let workOutsQuery = HKSampleQuery(sampleType: workOutsSampleType, predicate: workOutsPredicate, limit: 0, sortDescriptors: [sortDescrptor]) { (workoutsQuery, results, error) -> Void in if (error != nil){ print("獲得失敗") return } if results != nil{ completion(results!,nil) } } self.hkHealthStore.executeQuery(workOutsQuery) }


然后在WorkOutsViewController.swift文件的viewWillAppear()方法中要求workout

self.healthManager?.fetchWorkOutsData({ (results, error) -> Void in if error != nil{ print("獲得失敗") }else{ self.workOuts = results as! [HKWorkout] } dispatch_async(dispatch_get_main_queue(), { () -> Void in self.tableView.reloadData() }); })


最后在tableView顯示以下
這里寫圖片描述

保存HKWorkout

在上面的界面的NavgationBarrightBarItem向下再拖1個控制器,并添加對應的文件AddWorkoutsViewController.swift,并在IB中設置界面信息以下
這里寫圖片描述

然后在 AddWorkoutsViewController.swift 復寫 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath),針對點擊不同的cell,履行不同的方法。即讓用戶輸入點擊的cell對應的輸入方式,比如時間就是時間選擇器。距離就是1個警示框加1個文本框等。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: true) self.tableView.tableFooterView = UIView() switch indexPath.row{ case 0: self.setupPickerView() case 1,2: self.setupDatePickerView(indexPath.row) case 3,4: self.setupAlertView(indexPath.row) default: break } }


這里面對應的選擇的方法就不逐一介紹了,就是幾個普通的view的添加。添加完所有的信息以后就能夠點擊done 保存信息,方法以下:

@IBAction func addWorkOut(sender: AnyObject) { self.heathStore = HKHealthStore() //獲得距離和能量的數值 let distanceValue = Double(self.distanceLabel.text!) let energyValue = Double(self.energyLabel.text!) //根據上面的數值創建對應的HKQuantity對象 let distance = HKQuantity(unit: HKUnit.mileUnit(), doubleValue: distanceValue!) let energy = HKQuantity(unit: HKUnit.calorieUnit(), doubleValue: energyValue!) let endDate = self.dateFommater?.dateFromString(self.endDateLabel.text!) let startDate = self.dateFommater?.dateFromString(self.startDateLabel.text!) //這里我默許設置成running了。可以根據具體的類型再進行設置。 //創建HKWorkout對象。 let workout = HKWorkout(activityType: .Running, startDate: startDate!, endDate: endDate!, workoutEvents: nil, totalEnergyBurned: energy, totalDistance: distance, metadata: nil) //保存上面創建的HKWorkout對象 self.heathStore?.saveObject(workout, withCompletion: { (success, error) -> Void in if error != nil{ print("添加毛病") return } if success{ print("添加成功") dispatch_async(dispatch_get_main_queue(), { () -> Void in self.dismissViewControllerAnimated(true, completion: nil) }) } }) }


如果上面都履行成功,AddWorkoutsViewController.swift就會模態消失,然后在上面的1個頁面`WorkOutsViewController.swift就會在tableView的最上層顯示出我們剛才添加成功的HKWorkout

總結

在本人過完春節回到公司上班以后經理問我健康app里面的信息能不能獲得到。之前只是簡單了解了這個框架,但是里面的具體結構體系其實不了解。就趁著項目不忙,抽空把HeathKit學習了解了1下。本文的demo也采取了之前自學的Swift簡單的實現了1下(屬于Switer新手)。可能會有毛病或不準確的地方,如果你看到了,可以給我聯系ls_xyq@126.com,我會及時更改的。寫這篇文章1是對HeathKit的學習的1個練習,在這也是賜與后會用到的童鞋1個可以參考的東西。

HeathKit不只是上面的這些內容,但是能把上面的這些問題弄定,我覺得針對HeathKit的體系會有1個清楚的認識,學習HeathKit更深層次的內容會有很大的幫助。

本文的demo已放到github上面,需要的同學可以下載看看。

本文參考文章:

  1. HealthKit框架參考
  2. HealthKit開發教程Swift版
  3. The HealthKit Framework
  4. 逐日更新關注:http://weibo.com/hanjunqiang  新浪微博!iOS開發者交換QQ群: 446310206



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 99这里有精品 | 中文字幕在线观看第一页 | 欧美日韩综合在线 | 国产精品爽爽爽爽爽爽在线观看 | 国产啪 | 国产精品一区视频 | 久久精品国产亚洲一区二区三区 | 国产精品久久久久久久久久久久冷 | 色综合久久一区二区三区 | 亚洲午夜精品视频 | 欧美性一区二区三区 | 久久精品无码一区二区三区 | 国产区视频在线观看 | 国产成人午夜 | 999久久国精品免费观看网站 | 久久精品中文字幕 | 欧美日韩黄 | 精品国产第一国产综合精品 | 久久99精品国产91久久来源 | 黄色一级视频 | 成人h在线观看 | 久久免费av | 国产视频1区 | 国产精品久久久久久久久久久久 | 在线精品亚洲 | 99久久精品视频免费 | 青青久久网 | 九九热视频在线观看 | 在线观看国产麻豆 | com毛片 | 欧美一区二区三区久久精品 | 欧美一区二区大片 | www中文字幕| 美女很黄很黄免费的 | 日韩精品在线看 | 免费一级毛片在线观看 | 99老色批| 国产精品电影在线观看 | 精品在线免费视频 | 国产精品片一区二区三区 | 亚洲欧美一区二区三区国产精品 |