12/08/2018, 00:32

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

Ảnh chụp Màn hình 2015-04-21 lúc 21.05.32.png

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 :

Ảnh chụp Màn hình 2015-04-21 lúc 21.10.51.png

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 Ảnh chụp Màn hình 2015-04-21 lúc 21.47.46.png

    • Enable Healthkit trong app identifier trên member center Ảnh chụp Màn hình 2015-04-21 lúc 21.53.01.png

    • 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             </div>
            
            <div class=

0