Skip to content

Commit

Permalink
Merge pull request #69 from helloshim-forks/authorization-status
Browse files Browse the repository at this point in the history
Authorization status
  • Loading branch information
EJohnF authored Apr 29, 2019
2 parents 8c189e9 + ca1c0bb commit 581a982
Show file tree
Hide file tree
Showing 13 changed files with 83 additions and 58 deletions.
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 @@ -24,8 +24,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 @@ -67,8 +66,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 @@ -87,8 +85,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 @@ -104,8 +101,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 @@ -136,8 +132,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 @@ -198,8 +193,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 @@ -218,8 +212,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 @@ -235,8 +228,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 @@ -265,8 +257,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 @@ -118,8 +117,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 @@ -145,8 +143,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 @@ -168,9 +165,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 @@ -195,8 +190,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 @@ -233,8 +227,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 @@ -250,8 +243,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 @@ -287,8 +279,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 @@ -304,8 +295,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 @@ -341,8 +331,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 @@ -15,5 +15,7 @@
- (NSDictionary *)writePermsDict;
- (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 @@ -152,4 +152,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 @@ -266,9 +266,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 @@ -281,6 +279,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 @@ -106,6 +106,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)
* [setObserver](/docs/setObserver().md)
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).

0 comments on commit 581a982

Please sign in to comment.