Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Authorization status #69

Merged
merged 7 commits into from
Apr 29, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions RCTAppleHealthKit/RCTAppleHealthKit+Methods_Activity.m
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@ - (void)activity_getActiveEnergyBurned:(NSDictionary *)input callback:(RCTRespon
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting active energy burned samples: %@", error);
callback(@[RCTMakeError(@"error getting active energy burned samples", nil, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
}];
Expand Down Expand Up @@ -65,8 +64,7 @@ - (void)activity_getBasalEnergyBurned:(NSDictionary *)input callback:(RCTRespons
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting basal energy burned samples: %@", error);
callback(@[RCTMakeError(@"error getting basal energy burned samples", nil, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
}];
Expand Down
27 changes: 9 additions & 18 deletions RCTAppleHealthKit/RCTAppleHealthKit+Methods_Body.m
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ - (void)body_getLatestWeight:(NSDictionary *)input callback:(RCTResponseSenderBl
predicate:nil
completion:^(HKQuantity *mostRecentQuantity, NSDate *startDate, NSDate *endDate, NSError *error) {
if (!mostRecentQuantity) {
NSLog(@"error getting latest weight: %@", error);
callback(@[RCTMakeError(@"error getting latest weight", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
}
else {
// Determine the weight in the required unit.
Expand Down Expand Up @@ -71,8 +70,7 @@ - (void)body_getWeightSamples:(NSDictionary *)input callback:(RCTResponseSenderB
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting weight samples: %@", error);
callback(@[RCTMakeError(@"error getting weight samples", nil, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
}];
Expand All @@ -91,8 +89,7 @@ - (void)body_saveWeight:(NSDictionary *)input callback:(RCTResponseSenderBlock)c

[self.healthStore saveObject:weightSample withCompletion:^(BOOL success, NSError *error) {
if (!success) {
NSLog(@"error saving the weight sample: %@", error);
callback(@[RCTMakeError(@"error saving the weight sample", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
callback(@[[NSNull null], @(weight)]);
Expand All @@ -108,8 +105,7 @@ - (void)body_getLatestBodyMassIndex:(NSDictionary *)input callback:(RCTResponseS
predicate:nil
completion:^(HKQuantity *mostRecentQuantity, NSDate *startDate, NSDate *endDate, NSError *error) {
if (!mostRecentQuantity) {
NSLog(@"error getting latest BMI: %@", error);
callback(@[RCTMakeError(@"error getting latest BMI", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
}
else {
// Determine the bmi in the required unit.
Expand Down Expand Up @@ -140,8 +136,7 @@ - (void)body_saveBodyMassIndex:(NSDictionary *)input callback:(RCTResponseSender

[self.healthStore saveObject:bmiSample withCompletion:^(BOOL success, NSError *error) {
if (!success) {
NSLog(@"error saving BMI sample: %@.", error);
callback(@[RCTMakeError(@"error saving BMI sample", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
callback(@[[NSNull null], @(bmi)]);
Expand Down Expand Up @@ -206,8 +201,7 @@ - (void)body_getHeightSamples:(NSDictionary *)input callback:(RCTResponseSenderB
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting height samples: %@", error);
callback(@[RCTMakeError(@"error getting height samples", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
}];
Expand All @@ -230,8 +224,7 @@ - (void)body_saveHeight:(NSDictionary *)input callback:(RCTResponseSenderBlock)c

[self.healthStore saveObject:heightSample withCompletion:^(BOOL success, NSError *error) {
if (!success) {
NSLog(@"error saving height sample: %@", error);
callback(@[RCTMakeError(@"error saving height sample", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
callback(@[[NSNull null], @(height)]);
Expand All @@ -247,8 +240,7 @@ - (void)body_getLatestBodyFatPercentage:(NSDictionary *)input callback:(RCTRespo
predicate:nil
completion:^(HKQuantity *mostRecentQuantity, NSDate *startDate, NSDate *endDate, NSError *error) {
if (!mostRecentQuantity) {
NSLog(@"error getting latest body fat percentage: %@", error);
callback(@[RCTMakeError(@"error getting latest body fat percentage", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
}
else {
// Determine the weight in the required unit.
Expand Down Expand Up @@ -277,8 +269,7 @@ - (void)body_getLatestLeanBodyMass:(NSDictionary *)input callback:(RCTResponseSe
predicate:nil
completion:^(HKQuantity *mostRecentQuantity, NSDate *startDate, NSDate *endDate, NSError *error) {
if (!mostRecentQuantity) {
NSLog(@"error getting latest lean body mass: %@", error);
callback(@[RCTMakeError(@"error getting latest lean body mass", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
}
else {
HKUnit *weightUnit = [HKUnit poundUnit];
Expand Down
6 changes: 2 additions & 4 deletions RCTAppleHealthKit/RCTAppleHealthKit+Methods_Characteristic.m
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ - (void)characteristic_getBiologicalSex:(NSDictionary *)input callback:(RCTRespo
}

if(value == nil){
NSLog(@"error getting biological sex: %@", error);
callback(@[RCTMakeError(@"error getting biological sex", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}

Expand All @@ -52,8 +51,7 @@ - (void)characteristic_getDateOfBirth:(NSDictionary *)input callback:(RCTRespons
NSDate *dob = [self.healthStore dateOfBirthWithError:&error];

if(error != nil){
NSLog(@"error getting date of birth: %@", error);
callback(@[RCTMakeError(@"error getting date of birth", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
if(dob == nil) {
Expand Down
31 changes: 10 additions & 21 deletions RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.m
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ - (void)fitness_getStepCountOnDay:(NSDictionary *)input callback:(RCTResponseSen
day:date
completion:^(double value, NSDate *startDate, NSDate *endDate, NSError *error) {
if (!value) {
NSLog(@"could not fetch step count for day: %@", error);
callback(@[RCTMakeError(@"could not fetch step count for day", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}

Expand Down Expand Up @@ -72,8 +71,7 @@ - (void)fitness_getDailyStepSamples:(NSDictionary *)input callback:(RCTResponseS
limit:limit
completion:^(NSArray *arr, NSError *err){
if (err != nil) {
NSLog(@"error with fetchCumulativeSumStatisticsCollection: %@", err);
callback(@[RCTMakeError(@"error with fetchCumulativeSumStatisticsCollection", err, nil)]);
callback(@[RCTJSErrorFromNSError(err)]);
return;
}
callback(@[[NSNull null], arr]);
Expand All @@ -99,8 +97,7 @@ - (void)fitness_saveSteps:(NSDictionary *)input callback:(RCTResponseSenderBlock

[self.healthStore saveObject:sample withCompletion:^(BOOL success, NSError *error) {
if (!success) {
NSLog(@"An error occured saving the step count sample %@. The error was: %@.", sample, error);
callback(@[RCTMakeError(@"An error occured saving the step count sample", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
callback(@[[NSNull null], @(value)]);
Expand All @@ -122,9 +119,7 @@ - (void)fitness_initializeStepEventObserver:(NSDictionary *)input callback:(RCTR
NSError *error) {

if (error) {
// Perform Proper Error Handling Here...
NSLog(@"*** An error occured while setting up the stepCount observer. %@ ***", error.localizedDescription);
callback(@[RCTMakeError(@"An error occured while setting up the stepCount observer", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}

Expand All @@ -149,8 +144,7 @@ - (void)fitness_getDistanceWalkingRunningOnDay:(NSDictionary *)input callback:(R

[self fetchSumOfSamplesOnDayForType:quantityType unit:unit day:date completion:^(double distance, NSDate *startDate, NSDate *endDate, NSError *error) {
if (!distance) {
NSLog(@"ERROR getting DistanceWalkingRunning: %@", error);
callback(@[RCTMakeError(@"ERROR getting DistanceWalkingRunning", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}

Expand Down Expand Up @@ -187,8 +181,7 @@ - (void)fitness_getDailyDistanceWalkingRunningSamples:(NSDictionary *)input call
limit:limit
completion:^(NSArray *arr, NSError *err){
if (err != nil) {
NSLog(@"error with fetchCumulativeSumStatisticsCollection: %@", err);
callback(@[RCTMakeError(@"error with fetchCumulativeSumStatisticsCollection", err, nil)]);
callback(@[RCTJSErrorFromNSError(err)]);
return;
}
callback(@[[NSNull null], arr]);
Expand All @@ -204,8 +197,7 @@ - (void)fitness_getDistanceCyclingOnDay:(NSDictionary *)input callback:(RCTRespo

[self fetchSumOfSamplesOnDayForType:quantityType unit:unit day:date completion:^(double distance, NSDate *startDate, NSDate *endDate, NSError *error) {
if (!distance) {
NSLog(@"ERROR getting DistanceCycling: %@", error);
callback(@[RCTMakeError(@"ERROR getting DistanceCycling", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}

Expand Down Expand Up @@ -241,8 +233,7 @@ - (void)fitness_getDailyDistanceCyclingSamples:(NSDictionary *)input callback:(R
limit:limit
completion:^(NSArray *arr, NSError *err){
if (err != nil) {
NSLog(@"error with fetchCumulativeSumStatisticsCollection: %@", err);
callback(@[RCTMakeError(@"error with fetchCumulativeSumStatisticsCollection", err, nil)]);
callback(@[RCTJSErrorFromNSError(err)]);
return;
}
callback(@[[NSNull null], arr]);
Expand All @@ -258,8 +249,7 @@ - (void)fitness_getFlightsClimbedOnDay:(NSDictionary *)input callback:(RCTRespon

[self fetchSumOfSamplesOnDayForType:quantityType unit:unit day:date completion:^(double count, NSDate *startDate, NSDate *endDate, NSError *error) {
if (!count) {
NSLog(@"ERROR getting FlightsClimbed: %@", error);
callback(@[RCTMakeError(@"ERROR getting FlightsClimbed", error, nil), @(count)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}

Expand Down Expand Up @@ -295,8 +285,7 @@ - (void)fitness_getDailyFlightsClimbedSamples:(NSDictionary *)input callback:(RC
limit:limit
completion:^(NSArray *arr, NSError *err){
if (err != nil) {
NSLog(@"error with fetchCumulativeSumStatisticsCollection: %@", err);
callback(@[RCTMakeError(@"error with fetchCumulativeSumStatisticsCollection", err, nil)]);
callback(@[RCTJSErrorFromNSError(err)]);
return;
}
callback(@[[NSNull null], arr]);
Expand Down
3 changes: 1 addition & 2 deletions RCTAppleHealthKit/RCTAppleHealthKit+Methods_Mindfulness.m
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ - (void)mindfulness_saveMindfulSession:(NSDictionary *)input callback:(RCTRespon

[self.healthStore saveObject:sample withCompletion:^(BOOL success, NSError *error) {
if (!success) {
NSLog(@"An error occured saving the mindful session sample %@. The error was: %@.", sample, error);
callback(@[RCTMakeError(@"An error occured saving the mindful session sample", error, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
callback(@[[NSNull null], @(value)]);
Expand Down
3 changes: 1 addition & 2 deletions RCTAppleHealthKit/RCTAppleHealthKit+Methods_Results.m
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ - (void)results_getBloodGlucoseSamples:(NSDictionary *)input callback:(RCTRespon
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting blood glucose samples: %@", error);
callback(@[RCTMakeError(@"error getting blood glucose samples", nil, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
}];
Expand Down
3 changes: 1 addition & 2 deletions RCTAppleHealthKit/RCTAppleHealthKit+Methods_Sleep.m
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ - (void)sleep_getSleepSamples:(NSDictionary *)input callback:(RCTResponseSenderB
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting sleep samples: %@", error);
callback(@[RCTMakeError(@"error getting sleep samples", nil, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
}];
Expand Down
3 changes: 1 addition & 2 deletions RCTAppleHealthKit/RCTAppleHealthKit+Methods_Vitals.m
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ - (void)vitals_getHeartRateSamples:(NSDictionary *)input callback:(RCTResponseSe
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting heart rate samples: %@", error);
callback(@[RCTMakeError(@"error getting heart rate samples", nil, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
}
}];
Expand Down
2 changes: 2 additions & 0 deletions RCTAppleHealthKit/RCTAppleHealthKit+TypesAndPermissions.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,7 @@

- (NSSet *)getReadPermsFromOptions:(NSArray *)options;
- (NSSet *)getWritePermsFromOptions:(NSArray *)options;
- (HKObjectType *)getWritePermFromString:(NSString *)string;
- (NSString *)getAuthorizationStatusString:(HKAuthorizationStatus)status;

@end
14 changes: 14 additions & 0 deletions RCTAppleHealthKit/RCTAppleHealthKit+TypesAndPermissions.m
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,18 @@ - (NSSet *)getWritePermsFromOptions:(NSArray *)options {
return writePermSet;
}

- (HKObjectType *)getWritePermFromString:(NSString *)writePerm {
return [[self writePermsDict] objectForKey:writePerm];
}
- (NSString *)getAuthorizationStatusString:(HKAuthorizationStatus)status {
switch (status) {
case HKAuthorizationStatusNotDetermined:
return @"NotDetermined";
case HKAuthorizationStatusSharingDenied:
return @"SharingDenied";
case HKAuthorizationStatusSharingAuthorized:
return @"SharingAuthorized";
}
}

@end
26 changes: 23 additions & 3 deletions RCTAppleHealthKit/RCTAppleHealthKit.m
Original file line number Diff line number Diff line change
Expand Up @@ -253,9 +253,7 @@ - (void)initializeHealthKit:(NSDictionary *)input callback:(RCTResponseSenderBlo

[self.healthStore requestAuthorizationToShareTypes:writeDataTypes readTypes:readDataTypes completion:^(BOOL success, NSError *error) {
if (!success) {
NSString *errMsg = [NSString stringWithFormat:@"Error with HealthKit authorization: %@", error];
NSLog(errMsg);
callback(@[RCTMakeError(errMsg, nil, nil)]);
callback(@[RCTJSErrorFromNSError(error)]);
return;
} else {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
Expand All @@ -268,6 +266,28 @@ - (void)initializeHealthKit:(NSDictionary *)input callback:(RCTResponseSenderBlo
}
}

RCT_EXPORT_METHOD(authorizationStatusForType:(NSString *)type
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject
{
if (self.healthStore == nil) {
self.healthStore = [[HKHealthStore alloc] init];
}

if ([HKHealthStore isHealthDataAvailable]) {
HKObjectType *objectType = [self getWritePermFromString:type];
if (objectType == nil) {
reject(@"unknown write permission", nil, nil);
return;
}

NSString *status = [self getAuthorizationStatusString:[self.healthStore authorizationStatusForType:objectType]];
resolve(status);
} else {
reject(@"HealthKit data is not available", nil, nil);
}
})

- (void)getModuleInfo:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
{
NSDictionary *info = @{
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ AppleHealthKit.initHealthKit(options: Object, (err: string, results: Object) =>
* Base Methods
* [isAvailable](/docs/isAvailable().md)
* [initHealthKit](/docs/initHealthKit().md)
* [authorizationStatusForType](/docs/authorizationStatusForType().md)
* Realtime Methods
* [initStepCountObserver](/docs/initStepCountObserver().md)
* Read Methods
Expand Down
16 changes: 16 additions & 0 deletions docs/authorizationStatusForType().md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Check the authorization status for sharing (writing) the specified data type.

Status will be one of `"NotDetermined"`, `"SharingDenied"`, `"SharingAuthorized"`.

```javascript
try {
const status = await AppleHealthKit.authorizationStatusForType("StepCount")
if (status) {
console.log("status is", status)
}
} catch (error) {
console.warn(error)
}
```

There is no way to check authorization status for read permission, [see this](https://developer.apple.com/documentation/healthkit/hkhealthstore/1614154-authorizationstatusfortype?language=objc).