สร้างแอป HealthKit โดยใช้ SwiftUI
รับข้อมูลการนับก้าวจาก HealthKit
ในโครงการล่าสุดของฉัน ฉันสร้างแอปควบคุมอาหารที่ต้องมีการนับจำนวนก้าวของผู้ใช้จากแอปสุขภาพบน iPhone ดังนั้นฉันจึงใช้HealthKit
เฟรมเวิร์กของ Apple เพื่อให้งานสำเร็จลุล่วง
ต้องการทราบวิธีรับข้อมูลจำนวนก้าวของผู้ใช้จาก Health โดยใช้ HealthKit หรือไม่ เข้าเรื่องกันเลย!
ต้องทำหลายขั้นตอนเพื่อให้ได้จำนวนก้าว นั่นคือ:
- เปิดใช้งานความสามารถ HealthKit ในโครงการของเรา
- กำลังขอสิทธิ์แอป Health ของผู้ใช้
- ดึงข้อมูลการนับก้าว
- ตรวจสอบสถานะการอนุญาตด้านสุขภาพ
- การสร้างและอัปเดต UI
1. เปิดใช้งานความสามารถของ HealthKit ในโครงการของเรา
หากต้องการเปิดใช้ความสามารถ HealthKit ในแอปของเรา ให้เปิดโครงการของคุณ ไปที่ Signing & Capabilities คลิกปุ่มบวกที่ด้านขวาบนแล้วเลือก HealthKit
คุณสามารถตรวจสอบ Clinical Health Records ได้หากต้องการเข้าถึงบันทึกทางคลินิกของผู้ใช้และ Background Delivery เพื่อเปิดใช้งานการสังเกตการเปลี่ยนแปลงข้อมูลแบบเรียลไทม์
ฉันจะไม่ใส่จุดตรงนี้ เพราะการนับก้าวไม่ใช่เวชระเบียน และฉันไม่ต้องการข้อมูลการนับก้าวแบบเรียลไทม์
หลังจากนั้น ไปที่แท็บข้อมูล และเราต้องเพิ่มรหัสเพื่อใช้ HealthKit กุญแจสำคัญที่เราต้องการคือNSHealthShareUsageDescription
และNSHealthUpdateUsageDescription
.
2. การขออนุญาตแอปสุขภาพของผู้ใช้
ก่อนที่เราจะดึงข้อมูลจำนวนก้าว เราต้องได้รับอนุญาตจากผู้ใช้ในการเข้าถึงแอปสุขภาพ
ในการทำเช่นนั้น ฉันสร้างไฟล์ใหม่ชื่อHealthKitManager
โดยมีHealthKitManager
คลาสอยู่ข้างใน
อย่าลืมimport HealthKit
ที่ด้านบน จากนั้นสร้างฟังก์ชั่นที่ชื่อว่าsetupHealthRequest
.
func setUpHealthRequest(healthStore: HKHealthStore, readSteps: @escaping () -> Void) {
if HKHealthStore.isHealthDataAvailable(), let stepCount = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount) {
healthStore.requestAuthorization(toShare: [stepCount], read: [stepCount]) { success, error in
if success {
readSteps()
} else if error != nil {
// handle your error here
}
}
}
}
- บรรทัดแรก
HKHealthStore.isHealthDataAvailable()
ตรวจสอบว่ามี Health อยู่ในอุปกรณ์หรือไม่ - จากนั้นระบุข้อมูลที่เราต้องการรับ นั่นคือการนับก้าวโดยใช้
HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)
และแกะโดยif let
ใช้ - หลังจากที่ฉันระบุข้อมูลแล้ว เราก็เรียกใช้
requestAuthorization()
ฟังก์ชัน การดำเนินการนี้จะเรียกใช้ป๊อปอัปการอนุญาตแอป Health ซึ่งจะขอให้คุณอนุญาต นอกจากนี้เรายังระบุจำนวนก้าวเป็นข้อมูลในการเขียนและอ่าน หลังจากนั้น หากผู้ใช้อนุญาต เราจะอ่านจำนวนก้าว มิฉะนั้น จะจัดการข้อผิดพลาด
เมื่อเราสร้างsetupHealthRequest()
เมธอดแล้ว เรามาตั้งค่าเมธอดเพื่อดึงจำนวนก้าวของผู้ใช้ — readStepCount()
:
func readStepCount(forToday: Date, healthStore: HKHealthStore, completion: @escaping (Double) -> Void) {
guard let stepQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount) else { return }
let now = Date()
let startOfDay = Calendar.current.startOfDay(for: now)
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
let query = HKStatisticsQuery(quantityType: stepQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, error in
guard let result = result, let sum = result.sumQuantity() else {
completion(0.0)
return
}
completion(sum.doubleValue(for: HKUnit.count()))
}
healthStore.execute(query)
}
- สิ่งที่สองคือเตรียมวันที่เป็นภาคแสดงเพื่ออ่านข้อมูลจำนวนก้าวของวันนี้ หลังจากที่ฉันระบุวันที่แล้ว ฉันเพิ่มเพรดิเคตด้วยตัวเลือก
.strictStartDate
ซึ่งหมายความว่าข้อมูลที่อ่านต้องอยู่ภายในช่วงเวลาที่ระบุ ฉันจึงได้ข้อมูลจำนวนก้าวของวันนี้ที่แน่นอน - สิ่งต่อไปคือแบบสอบถาม ฉันใช้ตัวเลือก
.cumulativeSum
ในการคำนวณผลรวมของขั้นตอนทั้งหมดที่บันทึกไว้ในหนึ่งวัน เพราะถ้าคุณเปิด Health และไปที่ขั้นตอน คุณจะเห็นว่าขั้นตอนถูกบันทึกเป็นรายชั่วโมง ดังนั้นเราต้องรวมทั้งหมด เพื่อให้ได้จำนวนก้าวทั้งหมด - หลังจากคลายค่าผลลัพธ์ ฉันจะส่งคืนค่าที่เสร็จสมบูรณ์พร้อมผลรวมของจำนวนก้าวที่แปลงเป็นค่าสองเท่า
- สุดท้าย ดำเนินการค้นหาโดย
healthStore.execute(query)
ใช้
private var healthStore = HKHealthStore()
private var healthKitManager = HealthKitManager()
@Published var userStepCount = ""
@Published var isAuthorized = false
healthKitManager
เป็นอินสแตนซ์ของHealthKitManager
คลาสที่มีเมธอดการอนุญาตและการดึงข้อมูลuserStepCount
เป็นตัวแปรสำหรับการนับก้าวที่เราดึงมาisAuthorized
ในการตรวจสอบว่าผู้ใช้ให้สิทธิ์เข้าถึง Health หรือไม่ ฉันได้ทำเครื่องหมายทั้งสองอย่างuserStepCount
และisAuthorized
เป็นPublished
func healthRequest() {
healthKitManager.setUpHealthRequest(healthStore: healthStore) {
self.changeAuthorizationStatus()
self.readStepsTakenToday()
}
}
นี่คือรหัสสำหรับreadStepsTakenToday()
วิธีการ:
func readStepsTakenToday() {
healthKitManager.readStepCount(forToday: Date(), healthStore: healthStore) { step in
if step != 0.0 {
DispatchQueue.main.async {
self.userStepCount = String(format: "%.0f", step)
}
}
}
}
เราใช้DispatchQueue.main.async
เนื่องจากฟังก์ชันล้อมรอบทำงานบนเธรดพื้นหลัง และเราจำเป็นต้องอัปเดตค่าจากเธรดหลัก
4. ตรวจสอบสถานะการอนุญาตด้านสุขภาพ
ต่อไป เราต้องตรวจสอบสถานะการให้สิทธิ์เพื่ออัปเดต UI สำหรับสิ่งนั้น ฉันได้สร้างเมธอดที่เรียกchangeAuthorizationStatus()
ว่า
func changeAuthorizationStatus() {
guard let stepQtyType = HKObjectType.quantityType(forIdentifier: .stepCount) else { return }
let status = self.healthStore.authorizationStatus(for: stepQtyType)
switch status {
case .notDetermined:
isAuthorized = false
case .sharingDenied:
isAuthorized = false
case .sharingAuthorized:
isAuthorized = true
@unknown default:
isAuthorized = false
}
}
หมายเหตุ: เราจำเป็นต้องระบุจำนวนก้าวเป็นตัวแปรในsetupHealthRequest()
เมธอด เนื่องจากการตั้งค่าเป็นประเภทอ่านอย่างเดียว ( let
) จะส่งกลับ.sharingDenied
สถานะ ฉันพบสิ่งนี้ใน StackOverflow และคุณสามารถอ่านเพิ่มเติมเกี่ยวกับสิ่งนั้นได้ ที่ นี่
5. การสร้าง UI
วิธีการทั้งหมดของเราถูกกำหนดไว้แล้ว! ดังนั้นมาสร้าง UI กันตอนนี้
มันเป็นอินเทอร์เฟซที่เรียบง่าย หากผู้ใช้ไม่ได้รับอนุญาต เราจะแสดงข้อความText
ว่า “Please Authorize Health!” และ a Button
เพื่อทริกเกอร์วิธีการอนุญาต มิฉะนั้นจะแสดงจำนวนก้าวบนหน้าจอ
import SwiftUI
struct ContentView: View {
@EnvironmentObject var vm: HealthKitViewModel
var body: some View {
VStack {
if vm.isAuthorized {
VStack {
Text("Today's Step Count")
.font(.title3)
Text("\(vm.userStepCount)")
.font(.largeTitle)
.fontWeight(.bold)
}
} else {
VStack {
Text("Please Authorize Health!")
.font(.title3)
Button {
vm.healthRequest()
} label: {
Text("Authorize HealthKit")
.font(.headline)
.foregroundColor(.white)
}
.frame(width: 320, height: 55)
.background(Color(.orange))
.cornerRadius(10)
}
}
}
.padding()
.onAppear {
vm.readStepsTakenToday()
}
}
}
ทีนี้ลองรันบนเครื่องจำลอง
เราดึงข้อมูลจำนวนก้าวสำเร็จและแสดง แต่โปรดสังเกตว่าเมื่อฉันออกจากแอปและเปิดใหม่อีกครั้ง ฉันต้องแตะปุ่มอนุญาตสำหรับมุมมองเพื่ออัปเดตจำนวนการดึงข้อมูล
ในการแก้ไขปัญหานี้ เราจะเรียกใช้เมธอดchangeAuthorizationStatus()
ในเมธอดViewModel
'sinit
init() {
changeAuthorizationStatus()
}
และนั่นแหล่ะ! เราทำขั้นตอนทั้งหมด 5 ขั้นตอนสำเร็จแล้ว
สำหรับโครงการที่เสร็จสมบูรณ์ คุณสามารถตรวจสอบพื้นที่เก็บข้อมูล GitHub ของฉันได้ที่นี่
หากต้องการอ่านเพิ่มเติมเกี่ยวกับสิ่งที่คุณสามารถทำได้ด้วย HealthKit คุณสามารถอ่านเอกสารได้ที่นี่
คุณสามารถทำสิ่งต่างๆ ได้มากขึ้นด้วย HealthKit ตั้งแต่การระบุเพศของผู้ใช้ไปจนถึงการวิเคราะห์การนอนหลับและแม้แต่การออกกำลังกาย
ขอขอบคุณและฉันหวังว่าบทความนี้จะช่วยได้!