Tìm hiểu healthkit trên ios8
_ Từ ios 8.0 Apple giới thiệu một framework là Healthkit framework cung cấp 1 phương thức để share các thông tin về health và fitness. Từ ios 8 trên iphone và ipod có 1 app là "Health", app cho phép người dùng thêm các thông tin về health và fitness của họ và sau đó người dùng có quyền cho phép các ...
_ Từ ios 8.0 Apple giới thiệu một framework là Healthkit framework cung cấp 1 phương thức để share các thông tin về health và fitness. Từ ios 8 trên iphone và ipod có 1 app là "Health", app cho phép người dùng thêm các thông tin về health và fitness của họ và sau đó người dùng có quyền cho phép các app third party truy xuất modified các thông tin đó. Hôm nay tôi sẽ giới thiệu với các bạn một cách tổng quát cấu trúc các class của framework healtkit và cách truy nhập modfiied các thông tin health và fitness._
Các class cơ bản của HealthkitFramework
-
HKHealthStore: Class dùng để liên kết tất cả các dữ iệu được quản lý bởi HealthKit. dùng để request permission để đọc dữ liệu của healthkit. Khi được cho phép truy cập bạn có thể sử dụng HealthKit store để lưu những bản mẫu (samples) lên store hoặc query dữ liệu từ healthkit.
-
HKObject: Abstract class HealthKit object biểu diễn 1 phần dữ liệu được lưu trữ trong healkit store
vd: HKQuantitySample là subclass của HKSample:
@interface HKQuantitySample @property (readonly) HKQuantityType *quantityType; @property (readonly) HKQuantity *quantity; @end Chứa các thông tin về quantity type và quantity
- HKObjectType: Là absract class.lưu trữ các thông tin về dữ liệu lưu trong Healthkit store :
HKObjectType đóng vai trò một "factory" tạo ra các type subclass. Sau đó sẽ dùng các class này để lưu trữ dữ liệu của các HKObject subclass tương ứng vào trong healhkitstore
Các hàm creation của HKObjectType:
(HKQuantityType *)quantityTypeForIdentifier:(NSString *)identifier; (HKCategoryType *)categoryTypeForIdentifier:(NSString *)identifier; (HKCharacteristicType *)characteristicTypeForIdentifier:(NSString *)identifier;
-
HKUnit: Biểu diễn 1 đơn vị riêng trong healkitstore.
vd: HKUnit *g = [HKUnit gramUnit];
-
HKQuantity: Biểu diễn số lượng, quan hệ với HKUnit
vd : HKUnit *gramUnit = [HKUnit gramUnit]; HKQuantity *grams = [HKQuantity quantityWithUnit:gramUnit doubleValue:20];
-
HKQuery: là class để query dữ liệu từ Healthkit store.
@interface HKQuery @property (readonly) HKSampleType *sampleType; @property (readonly) NSPredicate *predicate; @end
Ví dụ sử dụng HKHealthStore để query và lưu dữ liệu lên Healthkit
- Cấu hình Healthkit và request permission:
-
Bật Healthkit capability trong xcode
-
Enable Healthkit trong app identifier trên member center
-
Check Healthkit avavailable bằng hàm isHealthDataAvaiable của healthkitstore để check bạn đang sử dụng hệ điều hành hoặc thiết bị hỗ trợ healthkit
-
Khởi tạo HKHealthStore object
-
Request authorization để access Healthkit Data
-
Sau đây là đoạn code authorization:
// Khai báo healthstore object: @interface HealkitService() @property (nonatomic, strong) HKHealthStore *healthStore; @end
// Hàm request permission
-(void)requestLPermission:(void (^)(BOOL, NSError *))callback { // Khai báo type data được phép read NSSet *healthKitTypesToRead = [self getTypesToRead]; // Khai báo type data được phép write NSSet *healkitTypesToWrite = [self getTypesToWrite]; if (![HKHealthStore isHealthDataAvailable]){ NSError *error = [NSError errorWithDomain:@"com.healhTest" code:2 userInfo:@{@"description":@"HealhKit is not available in this device"}]; if (callback) { callback(NO,error); } return; }else{ [_healthStore requestAuthorizationToShareTypes:healkitTypesToWrite readTypes:healthKitTypesToRead completion:^(BOOL success, NSError *error) { if (callback != nil) { callback(success,error); } }]; } } -(NSSet *)getTypesToRead { NSArray *types = @[HKCHARACTERISTIC(HKCharacteristicTypeIdentifierDateOfBirth),HKCHARACTERISTIC(HKCharacteristicTypeIdentifierBloodType),HKCHARACTERISTIC(HKCharacteristicTypeIdentifierDateOfBirth),HKQUANTITY(HKQuantityTypeIdentifierBodyMass),HKQUANTITY(HKQuantityTypeIdentifierHeight)]; return [[NSSet alloc]initWithArray:types]; } -(NSSet *)getTypesToWrite { NSArray *types = @[HKQUANTITY(HKQuantityTypeIdentifierBodyMass),HKQUANTITY(HKQuantityTypeIdentifierActiveEnergyBurned),HKQUANTITY(HKQuantityTypeIdentifierDistanceWalkingRunning),[HKObjectType workoutType]]; return [[NSSet alloc]initWithArray:types]; }
-
Read Data từ healthkit:
-(void)readMostRecentSample:(HKSampleType *)sampleType complete:(void(^)(HKSample *sampleType,NSError *error))complete { // Khởi tạo khoảng thời gian để query NSDate *past = [NSDate distantPast]; NSDate *now = [NSDate date]; NSPredicate *mostRecentPredicate = [HKQuery predicateForSamplesWithStartDate:past endDate:now options:HKQueryOptionNone]; // Khởi tạo NSSortDescriptor để sort thứ tự query NSSortDescriptor *sortDescriptor =[[NSSortDescriptor alloc]initWithKey:HKSampleSortIdentifierStartDate ascending:false]; int limit = 1; // Khởi tạo HKQuerry cho sampelType cần query với predicate và sortdescriptor đã cho ở trên HKQuery * sampleQuery = [[HKSampleQuery alloc]initWithSampleType:sampleType predicate:mostRecentPredicate limit:limit sortDescriptors:@[sortDescriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) { if (error) { complete (nil,error); } HKQuantitySample *mostRecentSample = (HKQuantitySample *)results.firstObject; if (complete) { complete(mostRecentSample, nil); } }]; // Excute Query [self.healthStore executeQuery:sampleQuery]; }
Cuối cùng là source code