สร้างแอป 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 ตั้งแต่การระบุเพศของผู้ใช้ไปจนถึงการวิเคราะห์การนอนหลับและแม้แต่การออกกำลังกาย
ขอขอบคุณและฉันหวังว่าบทความนี้จะช่วยได้!





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)