HealthKit
suggest changeObjective-C
First go the Target->Capabilities
and enable HealthKit
. This would setup the info.plist entry.
Make a new CocoaClass
of type NSObject
The filename I gave is GSHealthKitManager
and the header file is as shown below
GSHealthKitManager.h
#import <Foundation/Foundation.h>
#import <HealthKit/HealthKit.h>
@interface GSHealthKitManager : NSObject
+ (GSHealthKitManager *)sharedManager;
- (void)requestAuthorization;
- (NSDate *)readBirthDate;
- (void)writeWeightSample:(double)weight;
- (NSString *)readGender;
@end
GSHealthKitManager.m
#import "GSHealthKitManager.h"
#import <HealthKit/HealthKit.h>
@interface GSHealthKitManager ()
@property (nonatomic, retain) HKHealthStore *healthStore;
@end
@implementation GSHealthKitManager
+ (GSHealthKitManager *)sharedManager {
static dispatch_once_t pred = 0;
static GSHealthKitManager *instance = nil;
dispatch_once(&pred, ^{
instance = [[GSHealthKitManager alloc] init];
instance.healthStore = [[HKHealthStore alloc] init];
});
return instance;
}
- (void)requestAuthorization {
if ([HKHealthStore isHealthDataAvailable] == NO) {
// If our device doesn't support HealthKit -> return.
return;
}
NSArray *readTypes = @[[HKObjectType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierDateOfBirth],[HKObjectType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierBiologicalSex]];
[self.healthStore requestAuthorizationToShareTypes:nil readTypes:[NSSet setWithArray:readTypes] completion:nil];
}
- (NSDate *)readBirthDate {
NSError *error;
NSDate *dateOfBirth = [self.healthStore dateOfBirthWithError:&error]; // Convenience method of HKHealthStore to get date of birth directly.
if (!dateOfBirth) {
NSLog(@"Either an error occured fetching the user's age information or none has been stored yet. In your app, try to handle this gracefully.");
}
return dateOfBirth;
}
- (NSString *)readGender
{
NSError *error;
HKBiologicalSexObject *gen=[self.healthStore biologicalSexWithError:&error];
if (gen.biologicalSex==HKBiologicalSexMale)
{
return(@"Male");
}
else if (gen.biologicalSex==HKBiologicalSexFemale)
{
return (@"Female");
}
else if (gen.biologicalSex==HKBiologicalSexOther)
{
return (@"Other");
}
else{
return (@"Not Set");
}
}
@end
Calling from ViewController
- (IBAction)pressed:(id)sender {
[[GSHealthKitManager sharedManager] requestAuthorization];
NSDate *birthDate = [[GSHealthKitManager sharedManager] readBirthDate];
NSLog(@"birthdate %@", birthDate);
NSLog(@"gender 2131321 %@", [[GSHealthKitManager sharedManager] readGender]);
}
Log Output
2016-10-13 14:41:39.568 random[778:26371] birthdate 1992-11-29 18:30:00 +0000
2016-10-13 14:41:39.570 random[778:26371] gender 2131321 Male
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents