├── .watchmanconfig ├── .babelrc ├── ios ├── healthPulse │ ├── Images.xcassets │ │ ├── Contents.json │ │ ├── LaunchImage.launchimage │ │ │ ├── iPhone 6@2x.png │ │ │ ├── iPhone 6 Plus@2x.png │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ └── Contents.json │ ├── healthPulse.entitlements │ ├── Images-2.xcassets │ │ └── LaunchImage.launchimage │ │ │ └── Contents.json │ ├── AppDelegate.h │ ├── main.m │ ├── AppDelegate.m │ └── Info.plist ├── healthPulseTests │ ├── Info.plist │ └── healthPulseTests.m └── healthPulse.xcodeproj │ ├── xcshareddata │ └── xcschemes │ │ └── healthPulse.xcscheme │ └── project.pbxproj ├── .buckconfig ├── index.ios.js ├── __tests__ ├── index.ios.js └── index.android.js ├── .gitignore ├── app ├── healthkit │ └── index.js ├── styles.js └── index.js ├── package.json ├── .flowconfig └── README.md /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"] 3 | } -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/LaunchImage.launchimage/iPhone 6@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/LaunchImage.launchimage/iPhone 6@2x.png -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/LaunchImage.launchimage/iPhone 6 Plus@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximeHeckel/healthpulse/HEAD/ios/healthPulse/Images.xcassets/LaunchImage.launchimage/iPhone 6 Plus@2x.png -------------------------------------------------------------------------------- /index.ios.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | AppRegistry, 4 | } from 'react-native'; 5 | 6 | import healthPulse from './app' 7 | 8 | AppRegistry.registerComponent('healthPulse', () => healthPulse); 9 | -------------------------------------------------------------------------------- /ios/healthPulse/healthPulse.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.healthkit 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /__tests__/index.ios.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.ios.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /__tests__/index.android.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.android.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /ios/healthPulse/Images-2.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "minimum-system-version" : "7.0", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "orientation" : "portrait", 11 | "idiom" : "iphone", 12 | "minimum-system-version" : "7.0", 13 | "subtype" : "retina4", 14 | "scale" : "2x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ios/healthPulse/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (nonatomic, strong) UIWindow *window; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ios/healthPulse/main.m: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Copyright (c) 2015-present, Facebook, Inc. 4 | * All rights reserved. 5 | * 6 | * This source code is licensed under the BSD-style license found in the 7 | * LICENSE file in the root directory of this source tree. An additional grant 8 | * of patent rights can be found in the PATENTS file in the same directory. 9 | */ 10 | 11 | #import 12 | 13 | #import "AppDelegate.h" 14 | 15 | int main(int argc, char * argv[]) { 16 | @autoreleasepool { 17 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IJ 26 | # 27 | *.iml 28 | .idea 29 | .gradle 30 | local.properties 31 | 32 | # node.js 33 | # 34 | node_modules/ 35 | npm-debug.log 36 | 37 | # BUCK 38 | buck-out/ 39 | \.buckd/ 40 | android/app/libs 41 | android/keystores/debug.keystore 42 | 43 | main.jsbundle 44 | main.jsbundle.meta 45 | -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "extent" : "full-screen", 5 | "idiom" : "iphone", 6 | "subtype" : "736h", 7 | "filename" : "iPhone 6 Plus@2x.png", 8 | "minimum-system-version" : "8.0", 9 | "orientation" : "portrait", 10 | "scale" : "3x" 11 | }, 12 | { 13 | "extent" : "full-screen", 14 | "idiom" : "iphone", 15 | "subtype" : "667h", 16 | "filename" : "iPhone 6@2x.png", 17 | "minimum-system-version" : "8.0", 18 | "orientation" : "portrait", 19 | "scale" : "2x" 20 | } 21 | ], 22 | "info" : { 23 | "version" : 1, 24 | "author" : "xcode" 25 | } 26 | } -------------------------------------------------------------------------------- /app/healthkit/index.js: -------------------------------------------------------------------------------- 1 | import AppleHealthKit from 'react-native-apple-healthkit'; 2 | 3 | // setup the HealthKit initialization options 4 | const HKPERMS = AppleHealthKit.Constants.Permissions; 5 | 6 | const HKOPTIONS = { 7 | permissions: { 8 | read: [ 9 | HKPERMS.DistanceWalkingRunning, 10 | HKPERMS.DistanceCycling, 11 | HKPERMS.BasalEnergyBurned, 12 | HKPERMS.ActiveEnergyBurned, 13 | HKPERMS.AppleExerciseTime, 14 | HKPERMS.StepCount, 15 | HKPERMS.HeartRate, 16 | HKPERMS.SleepAnalysis, 17 | HKPERMS.Weight, 18 | HKPERMS.BodyFatPercentage, 19 | HKPERMS.BodyMassIndex, 20 | ], 21 | } 22 | }; 23 | 24 | module.exports = { 25 | HKOPTIONS, 26 | } 27 | 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "healthPulse", 3 | "version": "0.0.5", 4 | "private": true, 5 | "scripts": { 6 | "start": "node node_modules/react-native/local-cli/cli.js start", 7 | "test": "jest" 8 | }, 9 | "dependencies": { 10 | "base-64": "^0.1.0", 11 | "moment": "^2.17.1", 12 | "react": "15.3.2", 13 | "react-native": "0.36.0", 14 | "react-native-apple-healthkit": "^0.2.1", 15 | "react-native-background-fetch": "^1.0.0", 16 | "react-native-dismiss-keyboard": "^1.0.0" 17 | }, 18 | "jest": { 19 | "preset": "jest-react-native" 20 | }, 21 | "devDependencies": { 22 | "babel-jest": "16.0.0", 23 | "babel-preset-react-native": "1.9.0", 24 | "jest": "16.0.2", 25 | "jest-react-native": "16.0.0", 26 | "react-test-renderer": "15.3.2" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /ios/healthPulseTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/healthPulse/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-40x40@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-60x60@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@3x.png", 49 | "scale" : "3x" 50 | } 51 | ], 52 | "info" : { 53 | "version" : 1, 54 | "author" : "xcode" 55 | } 56 | } -------------------------------------------------------------------------------- /app/styles.js: -------------------------------------------------------------------------------- 1 | export default css = { 2 | container: { 3 | flex: 1, 4 | justifyContent: 'center', 5 | alignItems: 'center', 6 | backgroundColor: '#ECECF4', 7 | }, 8 | textContainer: { 9 | alignItems: 'flex-start', 10 | }, 11 | mainTitle: { 12 | fontSize: 36, 13 | textAlign: 'left', 14 | margin: 10, 15 | marginTop: 0, 16 | color: '#050505', 17 | fontWeight: '700', 18 | }, 19 | 20 | update: { 21 | textAlign: 'center', 22 | color: '#050505', 23 | fontWeight: '700', 24 | marginBottom: 5, 25 | marginTop: 30, 26 | }, 27 | instructions: { 28 | marginTop: 30, 29 | maxWidth: 300, 30 | textAlign: 'left', 31 | color: '#050505', 32 | paddingBottom: 20, 33 | }, 34 | inputWrapper: { 35 | marginTop: 5, 36 | borderBottomWidth: 2, 37 | borderBottomColor: '#F45B69', 38 | }, 39 | input: { 40 | height: 50, 41 | color: '#F45B69', 42 | width: 300, 43 | paddingLeft: 5, 44 | fontSize: 20, 45 | fontWeight: '700', 46 | }, 47 | buttonContainer: { 48 | height: 75, 49 | width: 300, 50 | flexDirection: 'column', 51 | alignItems: 'flex-start', 52 | }, 53 | button: { 54 | backgroundColor: '#F45B69', 55 | borderStyle: 'solid', 56 | borderWidth: 1, 57 | borderColor: '#F45B69', 58 | borderRadius: 3, 59 | height: 55, 60 | width: 300, 61 | position: 'absolute', 62 | bottom: 0, 63 | }, 64 | buttonInside: { 65 | textAlign: 'center', 66 | color: 'white', 67 | fontWeight: "700", 68 | lineHeight: 50, 69 | }, 70 | }; 71 | -------------------------------------------------------------------------------- /ios/healthPulse/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import "AppDelegate.h" 11 | 12 | #import "RCTBundleURLProvider.h" 13 | #import "RCTRootView.h" 14 | 15 | @implementation AppDelegate 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 18 | { 19 | NSURL *jsCodeLocation; 20 | 21 | //jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 22 | jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 23 | 24 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 25 | moduleName:@"healthPulse" 26 | initialProperties:nil 27 | launchOptions:launchOptions]; 28 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 29 | 30 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 31 | UIViewController *rootViewController = [UIViewController new]; 32 | rootViewController.view = rootView; 33 | self.window.rootViewController = rootViewController; 34 | [self.window makeKeyAndVisible]; 35 | return YES; 36 | } 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | 3 | # We fork some components by platform. 4 | .*/*[.]android.js 5 | 6 | # Ignore templates with `@flow` in header 7 | .*/local-cli/generator.* 8 | 9 | # Ignore malformed json 10 | .*/node_modules/y18n/test/.*\.json 11 | 12 | # Ignore the website subdir 13 | /website/.* 14 | 15 | # Ignore BUCK generated dirs 16 | /\.buckd/ 17 | 18 | # Ignore unexpected extra @providesModule 19 | .*/node_modules/commoner/test/source/widget/share.js 20 | 21 | # Ignore duplicate module providers 22 | # For RN Apps installed via npm, "Libraries" folder is inside node_modules/react-native but in the source repo it is in the root 23 | .*/Libraries/react-native/React.js 24 | .*/Libraries/react-native/ReactNative.js 25 | .*/node_modules/jest-runtime/build/__tests__/.* 26 | 27 | [include] 28 | 29 | [libs] 30 | node_modules/react-native/Libraries/react-native/react-native-interface.js 31 | node_modules/react-native/flow 32 | flow/ 33 | 34 | [options] 35 | module.system=haste 36 | 37 | esproposal.class_static_fields=enable 38 | esproposal.class_instance_fields=enable 39 | 40 | experimental.strict_type_args=true 41 | 42 | munge_underscores=true 43 | 44 | module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' 45 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 46 | 47 | suppress_type=$FlowIssue 48 | suppress_type=$FlowFixMe 49 | suppress_type=$FixMe 50 | 51 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-3]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 52 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(3[0-3]\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 53 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 54 | 55 | unsafe.enable_getters_and_setters=true 56 | 57 | [version] 58 | ^0.33.0 59 | -------------------------------------------------------------------------------- /ios/healthPulse/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Health Pulse 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSExceptionDomains 30 | 31 | localhost 32 | 33 | NSExceptionAllowsInsecureHTTPLoads 34 | 35 | 36 | 37 | 38 | NSHealthShareUsageDescription 39 | Read heart rate monitor data. 40 | NSHealthUpdateUsageDescription 41 | Share workout data with other apps. 42 | NSLocationWhenInUseUsageDescription 43 | 44 | UIBackgroundModes 45 | 46 | fetch 47 | 48 | UIRequiredDeviceCapabilities 49 | 50 | armv7 51 | healthkit 52 | 53 | UISupportedInterfaceOrientations 54 | 55 | UIInterfaceOrientationPortrait 56 | UIInterfaceOrientationLandscapeLeft 57 | UIInterfaceOrientationLandscapeRight 58 | 59 | UIViewControllerBasedStatusBarAppearance 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /ios/healthPulseTests/healthPulseTests.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | #import 12 | 13 | #import "RCTLog.h" 14 | #import "RCTRootView.h" 15 | 16 | #define TIMEOUT_SECONDS 600 17 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" 18 | 19 | @interface healthPulseTests : XCTestCase 20 | 21 | @end 22 | 23 | @implementation healthPulseTests 24 | 25 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test 26 | { 27 | if (test(view)) { 28 | return YES; 29 | } 30 | for (UIView *subview in [view subviews]) { 31 | if ([self findSubviewInView:subview matching:test]) { 32 | return YES; 33 | } 34 | } 35 | return NO; 36 | } 37 | 38 | - (void)testRendersWelcomeScreen 39 | { 40 | UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 41 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 42 | BOOL foundElement = NO; 43 | 44 | __block NSString *redboxError = nil; 45 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 46 | if (level >= RCTLogLevelError) { 47 | redboxError = message; 48 | } 49 | }); 50 | 51 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 52 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 53 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 54 | 55 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 56 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 57 | return YES; 58 | } 59 | return NO; 60 | }]; 61 | } 62 | 63 | RCTSetLogFunction(RCTDefaultLogFunction); 64 | 65 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 66 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 67 | } 68 | 69 | 70 | @end 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #HealthPulse 2 | 3 | HealthPulse is a small iOS app, built with React Native, that pushes data from HealthKit to a desired endpoint. 4 | 5 | 6 | ##Why? 7 | 8 | I felt that Apple lacked of a web API for HealthKit and I wanted to use my HealthKit data that was "trapped" in my iPhone, so I built my own API 9 | (which uses GraphQL) with my own health dashboard (see https://health.maximeheckel.com and https://github.com/MaximeHeckel/health-dashboard). 10 | This app basically allowed me to have a "bridge" between HealthKit and my API, and I thought that maybe other people would find it useful. 11 | 12 | I've improved it and used it for several months now and it helped me gathered a significant amount of data from my Apple Watch. 13 | 14 | ##Installation 15 | 16 | 1. Run it on your iOS device. 17 | 18 | - Clone the project (I might end up doing proper releases on Github) 19 | - Run `react-native bundle` 20 | - Open `/ios/healthPulse.xcodeproj` 21 | - In `appDelegate.m` copy and paste/replace the following lines to update the jsCodeLocation variable: 22 | 23 | ``` 24 | //jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 25 | jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 26 | ``` 27 | 28 | - Build and run the app (you might need a Apple Developer account to run it on a physical iOS device) 29 | 30 | 2. Contribute to the project 31 | 32 | - Clone the project 33 | - Inside the project folder, run `npm install` to install react-native and all the dependencies required for the project to run 34 | - Run `npm start` 35 | 36 | ##Usage 37 | 38 | I tried to make this app as simple as possible, in order to use it you just need to put your API endpoint on the first field, credentials for basic auth (if your server requires it) on the two following field and press and press the **Push data** button. 39 | If you let the app running on the background it will push your data against the endpoint you've set automatically (I used iOS Background Fetch for this, [learn more here](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html)). 40 | If you're looking for a server example: [https://github.com/MaximeHeckel/health-dashboard/tree/master/go/src/server](https://github.com/MaximeHeckel/health-dashboard/tree/master/go/src/server). 41 | 42 | 43 | ####Payload 44 | 45 | The folowing JSON object is a sample payload that the app sends: 46 | 47 | ``` 48 | { 49 | "date":"20170224", 50 | "heartRate": 51 | [{ 52 | "value":72, 53 | "startDate":"2017-02-24T18:58:26.947-0800", 54 | "endDate":"2017-02-24T18:58:26.947-0800" 55 | }, 56 | ... 57 | ], 58 | "stepCountSamples": 59 | [{ 60 | "value":34, 61 | "startDate":"2017-02-24T18:58:26.947-0800", 62 | "endDate":"2017-02-24T18:58:26.947-0800" 63 | }, 64 | ... 65 | ], 66 | "sleepAnalysus": 67 | [{ 68 | "value":"INBED", 69 | "startDate":"2017-02-24T18:58:26.947-0800", 70 | "endDate":"2017-02-24T18:58:26.947-0800" 71 | }, 72 | ... 73 | ], 74 | "stepCount": { 75 | "value": 1000, 76 | "startDate":"2017-02-24T18:58:26.947-0800", 77 | "endDate":"2017-02-24T18:58:26.947-0800" 78 | }, 79 | "cyclineDistance": { 80 | "value": 1000, 81 | "startDate":"2017-02-24T18:58:26.947-0800", 82 | "endDate":"2017-02-24T18:58:26.947-0800" 83 | }, 84 | "walkinRunningDistance": { 85 | "value": 1000, 86 | "startDate":"2017-02-24T18:58:26.947-0800", 87 | "endDate":"2017-02-24T18:58:26.947-0800" 88 | }, 89 | "weight": { 90 | "value": 7000, 91 | "startDate":"2017-02-24T18:58:26.947-0800", 92 | "endDate":"2017-02-24T18:58:26.947-0800" 93 | }, 94 | "bodyfatpercentage": { 95 | "value": 12, 96 | "startDate":"2017-02-24T18:58:26.947-0800", 97 | "endDate":"2017-02-24T18:58:26.947-0800" 98 | }, 99 | "bmi": { 100 | "value": 22, 101 | "startDate":"2017-02-24T18:58:26.947-0800", 102 | "endDate":"2017-02-24T18:58:26.947-0800" 103 | } 104 | } 105 | 106 | ``` 107 | 108 | ##Limitations 109 | 110 | It doesn't look like it's possible to have access to the data from HealthKit, when the phone is locked, thus the background push will only work while you're using the phone. -------------------------------------------------------------------------------- /ios/healthPulse.xcodeproj/xcshareddata/xcschemes/healthPulse.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { 3 | AlertIOS, 4 | AsyncStorage, 5 | StatusBar, 6 | StyleSheet, 7 | Text, 8 | TextInput, 9 | TouchableHighlight, 10 | TouchableWithoutFeedback, 11 | View, 12 | } from 'react-native'; 13 | import dismissKeyboard from 'react-native-dismiss-keyboard'; 14 | import AppleHealthKit from 'react-native-apple-healthkit'; 15 | import BackgroundFetch from 'react-native-background-fetch'; 16 | import moment from 'moment'; 17 | import base64 from 'base-64'; 18 | 19 | import { HKOPTIONS } from './healthkit'; 20 | import css from './styles'; 21 | 22 | const initialState = { 23 | currentDate: moment().format('YYYYMMDD'), 24 | cyclingDistance: {}, 25 | heartRate: [], 26 | inputAddress: '', 27 | sleepAnalysis: [], 28 | stepCount: {}, 29 | stepCountSamples: [], 30 | updateTime: null, 31 | walkingRunningDistance: {}, 32 | weight: {}, 33 | bodyfatpercentage: {}, 34 | bmi: {}, 35 | pressed: false, 36 | username: '', 37 | password: '', 38 | } 39 | 40 | export default class healthPulse extends Component { 41 | constructor(props) { 42 | super(props); 43 | this.state = initialState; 44 | } 45 | 46 | componentWillMount() { 47 | AsyncStorage.getItem('address').then((value) => { 48 | this.setState({inputAddress: value}); 49 | }).done(); 50 | AsyncStorage.getItem('username').then((value) => { 51 | this.setState({username: value}); 52 | }).done(); 53 | AsyncStorage.getItem('password').then((value) => { 54 | this.setState({password: value}); 55 | }).done(); 56 | } 57 | 58 | componentDidMount() { 59 | const self = this; 60 | 61 | AppleHealthKit.isAvailable((err,available) => { 62 | if(available){ 63 | AppleHealthKit.initHealthKit(HKOPTIONS, (err, res) => { 64 | if(this.handleHKError(err, 'initHealthKit')){ 65 | return; 66 | } 67 | }); 68 | } 69 | }); 70 | 71 | BackgroundFetch.configure({ 72 | stopOnTerminate: false 73 | }, function() { 74 | self.pushData(); 75 | }, function(error) { 76 | AlertIOS.alert('Error','BackgroundFetch failed to start') 77 | }); 78 | } 79 | 80 | urlValidator(str) { 81 | var pattern = new RegExp('https?\:\/\/[^\/\s]+(\/.*)?$'); 82 | 83 | if(!pattern.test(str)) { 84 | AlertIOS.alert('Error', 'Please enter a valid URL'); 85 | return false; 86 | } else { 87 | return true; 88 | } 89 | } 90 | 91 | pushData() { 92 | const currentDate = moment().format('YYYYMMDD'); 93 | let dataToPush = { 94 | date: currentDate, 95 | } 96 | 97 | return Promise.resolve() 98 | .then(() => { 99 | return this.fetchHeartRateToday(); 100 | }).then((samples) => { 101 | dataToPush.heartRate = samples; 102 | return this.fetchTotalStepCountToday(); 103 | }).then((count) => { 104 | dataToPush.stepCount = count; 105 | return this.fetchCyclingDataToday(); 106 | }).then((distance) => { 107 | dataToPush.cyclingDistance = distance; 108 | return this.fetchWalkingRunningDataToday(); 109 | }).then((distance) => { 110 | dataToPush.walkingRunningDistance = distance; 111 | return this.fetchSleepDataToday(); 112 | }).then((sleep) => { 113 | dataToPush.sleepAnalysis = sleep; 114 | return this.fetchStepRateToday(); 115 | }).then((samples) => { 116 | dataToPush.stepCountSamples = samples; 117 | return this.fetchBMIDataToday(); 118 | }).then((bmi) => { 119 | dataToPush.bmi = bmi; 120 | return this.fetchBodyFatPercentage(); 121 | }).then((bodyfatpercentage) => { 122 | dataToPush.bodyfatpercentage = bodyfatpercentage; 123 | return this.fetchWeightDataToday(); 124 | }).then((weight) => { 125 | dataToPush.weight = weight; 126 | if (this.urlValidator(this.state.inputAddress)){ 127 | let url = this.state.inputAddress; 128 | 129 | fetch(url, { 130 | method: 'POST', 131 | headers: { 132 | 'Accept': 'application/json', 133 | 'Authorization': `Basic ${base64.encode(`${this.state.username}:${this.state.password}`)}` 134 | }, 135 | body: JSON.stringify(dataToPush), 136 | }).then((data) => { 137 | BackgroundFetch.finish(); 138 | 139 | if (data.status >= 400) { 140 | AlertIOS.alert('Error', `HTTP error: ${data.status}`); 141 | return; 142 | } 143 | 144 | if (moment().diff(this.state.currentDate, 'days') > 0) { 145 | this.setState(initialState); 146 | } 147 | 148 | return this.setState({ updateTime: moment().format('hh:mm:ss a'), currentDate }); 149 | }).catch((error) => { 150 | BackgroundFetch.finish(); 151 | AlertIOS.alert('Error', `An error occured while pushing the data: ${error}`); 152 | }); 153 | } 154 | }); 155 | } 156 | 157 | handleHKError(err, method) { 158 | if(err){ 159 | return true; 160 | } 161 | return false; 162 | } 163 | 164 | fetchTotalStepCountToday() { 165 | const options = { 166 | date: new Date().toISOString() 167 | }; 168 | 169 | return new Promise((resolve) => { 170 | AppleHealthKit.getStepCount(options, (err, steps) => { 171 | if(this.handleHKError(err, 'getStepCount')){ 172 | resolve(this.state.stepCount); 173 | return; 174 | } 175 | this.setState({ stepCount: steps }); 176 | resolve(steps); 177 | }); 178 | }); 179 | } 180 | 181 | fetchStepRateToday() { 182 | let d = new Date(); 183 | d.setHours(0,0,0,0); 184 | 185 | const options = { 186 | startDate: d.toISOString(), 187 | endDate: (new Date()).toISOString(), 188 | }; 189 | 190 | return new Promise((resolve) => { 191 | AppleHealthKit.getDailyStepCountSamples(options: Object, (err, samples) => { 192 | if(this.handleHKError(err, 'getDailyStepCountSamples')){ 193 | resolve(this.state.stepCountSamples); 194 | return; 195 | } 196 | this.setState({ stepCountSamples: samples }) 197 | resolve(samples); 198 | }); 199 | }); 200 | } 201 | 202 | fetchHeartRateToday() { 203 | let d = new Date(); 204 | d.setHours(0,0,0,0); 205 | 206 | const options = { 207 | unit: 'bpm', 208 | startDate: d.toISOString(), 209 | endDate: (new Date()).toISOString(), 210 | ascending: false, 211 | }; 212 | 213 | return new Promise((resolve) => { 214 | AppleHealthKit.getHeartRateSamples(options, (err, samples) => { 215 | if(this.handleHKError(err, 'getHeartRateSamples')){ 216 | resolve(this.state.heartRate); 217 | return; 218 | } 219 | this.setState({ heartRate: samples }); 220 | resolve(samples); 221 | }); 222 | }); 223 | } 224 | 225 | fetchCyclingDataToday() { 226 | const options = { 227 | unit: 'meter', 228 | date: (new Date()).toISOString(), 229 | }; 230 | return new Promise((resolve) => { 231 | AppleHealthKit.getDistanceCycling(options, (err, distance) => { 232 | if(this.handleHKError(err, 'getDistanceCycling')){ 233 | resolve(this.state.cyclingDistance); 234 | return; 235 | } 236 | this.setState({ cyclingDistance: distance }) 237 | resolve(distance); 238 | }); 239 | }); 240 | } 241 | 242 | fetchWalkingRunningDataToday() { 243 | const options = { 244 | unit: 'meter', 245 | date: (new Date()).toISOString(), 246 | }; 247 | 248 | return new Promise((resolve) => { 249 | AppleHealthKit.getDistanceWalkingRunning(options, (err, distance) => { 250 | if(this.handleHKError(err, 'getDistanceWalkingRunning')){ 251 | resolve(this.state.walkingRunningDistance) 252 | return; 253 | } 254 | this.setState({ walkingRunningDistance: distance }); 255 | resolve(distance); 256 | }); 257 | }); 258 | } 259 | 260 | fetchWeightDataToday() { 261 | const options = { 262 | unit: 'gram', 263 | date: (new Date()).toISOString(), 264 | }; 265 | 266 | return new Promise((resolve) => { 267 | AppleHealthKit.getLatestWeight(options, (err, weight) => { 268 | if(this.handleHKError(err, 'getLatestWeight')){ 269 | resolve(this.state.weight) 270 | return; 271 | } 272 | this.setState({ weight }); 273 | resolve(weight); 274 | }); 275 | }); 276 | } 277 | 278 | fetchBodyFatPercentage() { 279 | return new Promise((resolve) => { 280 | AppleHealthKit.getLatestBodyFatPercentage(null, (err, bodyfatpercentage) => { 281 | if(this.handleHKError(err, 'getLatestBodyFatPercentage')){ 282 | resolve(this.state.bodyfatpercentage) 283 | return; 284 | } 285 | this.setState({ bodyfatpercentage }); 286 | resolve(bodyfatpercentage); 287 | }); 288 | }); 289 | } 290 | 291 | fetchBMIDataToday() { 292 | return new Promise((resolve) => { 293 | AppleHealthKit.getLatestBmi(null, (err, bmi) => { 294 | if(this.handleHKError(err, 'getLatestBmi')){ 295 | resolve(this.state.bmi) 296 | return; 297 | } 298 | this.setState({ bmi }); 299 | resolve(bmi); 300 | }); 301 | }); 302 | } 303 | 304 | fetchSleepDataToday() { 305 | let d = new Date(); 306 | d.setHours(0,0,0,0); 307 | 308 | const options = { 309 | startDate: d.toISOString(), 310 | endDate: (new Date()).toISOString(), 311 | }; 312 | 313 | return new Promise((resolve) => { 314 | AppleHealthKit.getSleepSamples(options, (err, samples) => { 315 | if(this.handleHKError(err, 'getSleepSamples')){ 316 | resolve(this.state.sleepAnalysis); 317 | return; 318 | } 319 | this.setState({ sleepAnalysis: samples }); 320 | resolve(samples); 321 | }); 322 | }); 323 | } 324 | 325 | render() { 326 | return ( 327 | dismissKeyboard()}> 328 | 329 | 330 | 331 | 332 | Push my 333 | 334 | 335 | HealthKit data to 336 | 337 | 338 | 339 | { 342 | AsyncStorage.setItem('address', text) 343 | this.setState({ inputAddress: text }) 344 | }} 345 | value={this.state.inputAddress} 346 | placeholder="Enter valid endpoint here" 347 | /> 348 | 349 | 350 | Basic authentication credentials 351 | 352 | 353 | { 356 | AsyncStorage.setItem('username', text) 357 | this.setState({ username: text }) 358 | }} 359 | value={this.state.username} 360 | placeholder="Username" 361 | /> 362 | 363 | 364 | { 367 | AsyncStorage.setItem('password', text) 368 | this.setState({ password: text }) 369 | }} 370 | value={this.state.password} 371 | placeholder="Password" 372 | secureTextEntry 373 | /> 374 | 375 | 376 | 377 | Your accessible health data from HealthKit will be pushed 378 | automatically to the selected endpoint when this app runs 379 | in the background. 380 | 381 | 382 | 383 | {this.state.updateTime ? `Last update: ${this.state.updateTime}` : null} 384 | 385 | 386 | {this.setState({pressed: false})}} 390 | onShowUnderlay={()=>{this.setState({pressed: true})}} 391 | > 392 | 393 | Push data 394 | 395 | 396 | 397 | 398 | 399 | ); 400 | } 401 | } 402 | 403 | const styles = StyleSheet.create(css); 404 | -------------------------------------------------------------------------------- /ios/healthPulse.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 11 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 12 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 13 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 14 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 15 | 00E356F31AD99517003FC87E /* healthPulseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* healthPulseTests.m */; }; 16 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 17 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 18 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 19 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 20 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 21 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 22 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 23 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 24 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 25 | 9C1FE7E61DC6D13500E57403 /* libRNBackgroundFetch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C1FE7E51DC6D11C00E57403 /* libRNBackgroundFetch.a */; }; 26 | 9C1FE7E91DC6D16600E57403 /* TSBackgroundFetch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C1FE7E81DC6D16600E57403 /* TSBackgroundFetch.framework */; }; 27 | 9C1FE7EB1DC6D20F00E57403 /* RNBackgroundFetch+AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1FE7EA1DC6D20F00E57403 /* RNBackgroundFetch+AppDelegate.m */; }; 28 | 9C1FE7F21DC6D44100E57403 /* libRCTAppleHealthKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C1FE7F11DC6D42D00E57403 /* libRCTAppleHealthKit.a */; }; 29 | 9C1FE8031DC6D4EA00E57403 /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C1FE8021DC6D4EA00E57403 /* HealthKit.framework */; }; 30 | /* End PBXBuildFile section */ 31 | 32 | /* Begin PBXContainerItemProxy section */ 33 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 36 | proxyType = 2; 37 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 38 | remoteInfo = RCTActionSheet; 39 | }; 40 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { 41 | isa = PBXContainerItemProxy; 42 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 43 | proxyType = 2; 44 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 45 | remoteInfo = RCTGeolocation; 46 | }; 47 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { 48 | isa = PBXContainerItemProxy; 49 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 50 | proxyType = 2; 51 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676; 52 | remoteInfo = RCTImage; 53 | }; 54 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { 55 | isa = PBXContainerItemProxy; 56 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 57 | proxyType = 2; 58 | remoteGlobalIDString = 58B511DB1A9E6C8500147676; 59 | remoteInfo = RCTNetwork; 60 | }; 61 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { 62 | isa = PBXContainerItemProxy; 63 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 64 | proxyType = 2; 65 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; 66 | remoteInfo = RCTVibration; 67 | }; 68 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { 69 | isa = PBXContainerItemProxy; 70 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 71 | proxyType = 1; 72 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 73 | remoteInfo = healthPulse; 74 | }; 75 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { 76 | isa = PBXContainerItemProxy; 77 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 78 | proxyType = 2; 79 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 80 | remoteInfo = RCTSettings; 81 | }; 82 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { 83 | isa = PBXContainerItemProxy; 84 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 85 | proxyType = 2; 86 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A; 87 | remoteInfo = RCTWebSocket; 88 | }; 89 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { 90 | isa = PBXContainerItemProxy; 91 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 92 | proxyType = 2; 93 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; 94 | remoteInfo = React; 95 | }; 96 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { 97 | isa = PBXContainerItemProxy; 98 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 99 | proxyType = 2; 100 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 101 | remoteInfo = RCTLinking; 102 | }; 103 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { 104 | isa = PBXContainerItemProxy; 105 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 106 | proxyType = 2; 107 | remoteGlobalIDString = 58B5119B1A9E6C1200147676; 108 | remoteInfo = RCTText; 109 | }; 110 | 9C1FE7C71DC6D11C00E57403 /* PBXContainerItemProxy */ = { 111 | isa = PBXContainerItemProxy; 112 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 113 | proxyType = 2; 114 | remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; 115 | remoteInfo = "RCTImage-tvOS"; 116 | }; 117 | 9C1FE7CB1DC6D11C00E57403 /* PBXContainerItemProxy */ = { 118 | isa = PBXContainerItemProxy; 119 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 120 | proxyType = 2; 121 | remoteGlobalIDString = 2D2A28471D9B043800D4039D; 122 | remoteInfo = "RCTLinking-tvOS"; 123 | }; 124 | 9C1FE7CF1DC6D11C00E57403 /* PBXContainerItemProxy */ = { 125 | isa = PBXContainerItemProxy; 126 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 127 | proxyType = 2; 128 | remoteGlobalIDString = 2D2A28541D9B044C00D4039D; 129 | remoteInfo = "RCTNetwork-tvOS"; 130 | }; 131 | 9C1FE7D31DC6D11C00E57403 /* PBXContainerItemProxy */ = { 132 | isa = PBXContainerItemProxy; 133 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 134 | proxyType = 2; 135 | remoteGlobalIDString = 2D2A28611D9B046600D4039D; 136 | remoteInfo = "RCTSettings-tvOS"; 137 | }; 138 | 9C1FE7D71DC6D11C00E57403 /* PBXContainerItemProxy */ = { 139 | isa = PBXContainerItemProxy; 140 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 141 | proxyType = 2; 142 | remoteGlobalIDString = 2D2A287B1D9B048500D4039D; 143 | remoteInfo = "RCTText-tvOS"; 144 | }; 145 | 9C1FE7DC1DC6D11C00E57403 /* PBXContainerItemProxy */ = { 146 | isa = PBXContainerItemProxy; 147 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 148 | proxyType = 2; 149 | remoteGlobalIDString = 2D2A28881D9B049200D4039D; 150 | remoteInfo = "RCTWebSocket-tvOS"; 151 | }; 152 | 9C1FE7E01DC6D11C00E57403 /* PBXContainerItemProxy */ = { 153 | isa = PBXContainerItemProxy; 154 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 155 | proxyType = 2; 156 | remoteGlobalIDString = 2D2A28131D9B038B00D4039D; 157 | remoteInfo = "React-tvOS"; 158 | }; 159 | 9C1FE7E41DC6D11C00E57403 /* PBXContainerItemProxy */ = { 160 | isa = PBXContainerItemProxy; 161 | containerPortal = 9C1FE7C01DC6D11B00E57403 /* RNBackgroundFetch.xcodeproj */; 162 | proxyType = 2; 163 | remoteGlobalIDString = 835318541D52293F005738CD; 164 | remoteInfo = RNBackgroundFetch; 165 | }; 166 | 9C1FE7F01DC6D42D00E57403 /* PBXContainerItemProxy */ = { 167 | isa = PBXContainerItemProxy; 168 | containerPortal = 9C1FE7EC1DC6D42D00E57403 /* RCTAppleHealthKit.xcodeproj */; 169 | proxyType = 2; 170 | remoteGlobalIDString = 3774C88D1D2092F20000B3F3; 171 | remoteInfo = RCTAppleHealthKit; 172 | }; 173 | /* End PBXContainerItemProxy section */ 174 | 175 | /* Begin PBXFileReference section */ 176 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 177 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; 178 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; 179 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; 180 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; 181 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; 182 | 00E356EE1AD99517003FC87E /* healthPulseTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = healthPulseTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 183 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 184 | 00E356F21AD99517003FC87E /* healthPulseTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = healthPulseTests.m; sourceTree = ""; }; 185 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 186 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 187 | 13B07F961A680F5B00A75B9A /* healthPulse.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = healthPulse.app; sourceTree = BUILT_PRODUCTS_DIR; }; 188 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = healthPulse/AppDelegate.h; sourceTree = ""; }; 189 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = healthPulse/AppDelegate.m; sourceTree = ""; }; 190 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = healthPulse/Images.xcassets; sourceTree = ""; }; 191 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = healthPulse/Info.plist; sourceTree = ""; }; 192 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = healthPulse/main.m; sourceTree = ""; }; 193 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; 194 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 195 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 196 | 9C1FE7C01DC6D11B00E57403 /* RNBackgroundFetch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNBackgroundFetch.xcodeproj; path = "../node_modules/react-native-background-fetch/ios/RNBackgroundFetch.xcodeproj"; sourceTree = ""; }; 197 | 9C1FE7E81DC6D16600E57403 /* TSBackgroundFetch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TSBackgroundFetch.framework; path = "../node_modules/react-native-background-fetch/ios/RNBackgroundFetch/TSBackgroundFetch.framework"; sourceTree = ""; }; 198 | 9C1FE7EA1DC6D20F00E57403 /* RNBackgroundFetch+AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "RNBackgroundFetch+AppDelegate.m"; path = "../node_modules/react-native-background-fetch/ios/RNBackgroundFetch/RNBackgroundFetch+AppDelegate.m"; sourceTree = ""; }; 199 | 9C1FE7EC1DC6D42D00E57403 /* RCTAppleHealthKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAppleHealthKit.xcodeproj; path = "../node_modules/react-native-apple-healthkit/RCTAppleHealthKit.xcodeproj"; sourceTree = ""; }; 200 | 9C1FE7F51DC6D48600E57403 /* healthPulse.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = healthPulse.entitlements; path = healthPulse/healthPulse.entitlements; sourceTree = ""; }; 201 | 9C1FE8021DC6D4EA00E57403 /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = System/Library/Frameworks/HealthKit.framework; sourceTree = SDKROOT; }; 202 | /* End PBXFileReference section */ 203 | 204 | /* Begin PBXFrameworksBuildPhase section */ 205 | 00E356EB1AD99517003FC87E /* Frameworks */ = { 206 | isa = PBXFrameworksBuildPhase; 207 | buildActionMask = 2147483647; 208 | files = ( 209 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, 210 | ); 211 | runOnlyForDeploymentPostprocessing = 0; 212 | }; 213 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 214 | isa = PBXFrameworksBuildPhase; 215 | buildActionMask = 2147483647; 216 | files = ( 217 | 9C1FE7F21DC6D44100E57403 /* libRCTAppleHealthKit.a in Frameworks */, 218 | 9C1FE7E91DC6D16600E57403 /* TSBackgroundFetch.framework in Frameworks */, 219 | 9C1FE7E61DC6D13500E57403 /* libRNBackgroundFetch.a in Frameworks */, 220 | 146834051AC3E58100842450 /* libReact.a in Frameworks */, 221 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 222 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 223 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 224 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 225 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 226 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 227 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 228 | 9C1FE8031DC6D4EA00E57403 /* HealthKit.framework in Frameworks */, 229 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 230 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | }; 234 | /* End PBXFrameworksBuildPhase section */ 235 | 236 | /* Begin PBXGroup section */ 237 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = { 238 | isa = PBXGroup; 239 | children = ( 240 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, 241 | ); 242 | name = Products; 243 | sourceTree = ""; 244 | }; 245 | 00C302B61ABCB90400DB3ED1 /* Products */ = { 246 | isa = PBXGroup; 247 | children = ( 248 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, 249 | ); 250 | name = Products; 251 | sourceTree = ""; 252 | }; 253 | 00C302BC1ABCB91800DB3ED1 /* Products */ = { 254 | isa = PBXGroup; 255 | children = ( 256 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 257 | 9C1FE7C81DC6D11C00E57403 /* libRCTImage-tvOS.a */, 258 | ); 259 | name = Products; 260 | sourceTree = ""; 261 | }; 262 | 00C302D41ABCB9D200DB3ED1 /* Products */ = { 263 | isa = PBXGroup; 264 | children = ( 265 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 266 | 9C1FE7D01DC6D11C00E57403 /* libRCTNetwork-tvOS.a */, 267 | ); 268 | name = Products; 269 | sourceTree = ""; 270 | }; 271 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = { 272 | isa = PBXGroup; 273 | children = ( 274 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, 275 | ); 276 | name = Products; 277 | sourceTree = ""; 278 | }; 279 | 00E356EF1AD99517003FC87E /* healthPulseTests */ = { 280 | isa = PBXGroup; 281 | children = ( 282 | 00E356F21AD99517003FC87E /* healthPulseTests.m */, 283 | 00E356F01AD99517003FC87E /* Supporting Files */, 284 | ); 285 | path = healthPulseTests; 286 | sourceTree = ""; 287 | }; 288 | 00E356F01AD99517003FC87E /* Supporting Files */ = { 289 | isa = PBXGroup; 290 | children = ( 291 | 00E356F11AD99517003FC87E /* Info.plist */, 292 | ); 293 | name = "Supporting Files"; 294 | sourceTree = ""; 295 | }; 296 | 139105B71AF99BAD00B5F7CC /* Products */ = { 297 | isa = PBXGroup; 298 | children = ( 299 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 300 | 9C1FE7D41DC6D11C00E57403 /* libRCTSettings-tvOS.a */, 301 | ); 302 | name = Products; 303 | sourceTree = ""; 304 | }; 305 | 139FDEE71B06529A00C62182 /* Products */ = { 306 | isa = PBXGroup; 307 | children = ( 308 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 309 | 9C1FE7DD1DC6D11C00E57403 /* libRCTWebSocket-tvOS.a */, 310 | ); 311 | name = Products; 312 | sourceTree = ""; 313 | }; 314 | 13B07FAE1A68108700A75B9A /* healthPulse */ = { 315 | isa = PBXGroup; 316 | children = ( 317 | 9C1FE7F51DC6D48600E57403 /* healthPulse.entitlements */, 318 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 319 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 320 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 321 | 9C1FE7EA1DC6D20F00E57403 /* RNBackgroundFetch+AppDelegate.m */, 322 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 323 | 13B07FB61A68108700A75B9A /* Info.plist */, 324 | 13B07FB71A68108700A75B9A /* main.m */, 325 | ); 326 | name = healthPulse; 327 | sourceTree = ""; 328 | }; 329 | 146834001AC3E56700842450 /* Products */ = { 330 | isa = PBXGroup; 331 | children = ( 332 | 146834041AC3E56700842450 /* libReact.a */, 333 | 9C1FE7E11DC6D11C00E57403 /* libReact-tvOS.a */, 334 | ); 335 | name = Products; 336 | sourceTree = ""; 337 | }; 338 | 78C398B11ACF4ADC00677621 /* Products */ = { 339 | isa = PBXGroup; 340 | children = ( 341 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 342 | 9C1FE7CC1DC6D11C00E57403 /* libRCTLinking-tvOS.a */, 343 | ); 344 | name = Products; 345 | sourceTree = ""; 346 | }; 347 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 348 | isa = PBXGroup; 349 | children = ( 350 | 9C1FE7EC1DC6D42D00E57403 /* RCTAppleHealthKit.xcodeproj */, 351 | 9C1FE7C01DC6D11B00E57403 /* RNBackgroundFetch.xcodeproj */, 352 | 146833FF1AC3E56700842450 /* React.xcodeproj */, 353 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 354 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 355 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 356 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 357 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 358 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 359 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 360 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 361 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 362 | ); 363 | name = Libraries; 364 | sourceTree = ""; 365 | }; 366 | 832341B11AAA6A8300B99B32 /* Products */ = { 367 | isa = PBXGroup; 368 | children = ( 369 | 832341B51AAA6A8300B99B32 /* libRCTText.a */, 370 | 9C1FE7D81DC6D11C00E57403 /* libRCTText-tvOS.a */, 371 | ); 372 | name = Products; 373 | sourceTree = ""; 374 | }; 375 | 83CBB9F61A601CBA00E9B192 = { 376 | isa = PBXGroup; 377 | children = ( 378 | 13B07FAE1A68108700A75B9A /* healthPulse */, 379 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 380 | 00E356EF1AD99517003FC87E /* healthPulseTests */, 381 | 83CBBA001A601CBA00E9B192 /* Products */, 382 | 9C1FE7E71DC6D16600E57403 /* Frameworks */, 383 | ); 384 | indentWidth = 2; 385 | sourceTree = ""; 386 | tabWidth = 2; 387 | }; 388 | 83CBBA001A601CBA00E9B192 /* Products */ = { 389 | isa = PBXGroup; 390 | children = ( 391 | 13B07F961A680F5B00A75B9A /* healthPulse.app */, 392 | 00E356EE1AD99517003FC87E /* healthPulseTests.xctest */, 393 | ); 394 | name = Products; 395 | sourceTree = ""; 396 | }; 397 | 9C1FE7C11DC6D11B00E57403 /* Products */ = { 398 | isa = PBXGroup; 399 | children = ( 400 | 9C1FE7E51DC6D11C00E57403 /* libRNBackgroundFetch.a */, 401 | ); 402 | name = Products; 403 | sourceTree = ""; 404 | }; 405 | 9C1FE7E71DC6D16600E57403 /* Frameworks */ = { 406 | isa = PBXGroup; 407 | children = ( 408 | 9C1FE8021DC6D4EA00E57403 /* HealthKit.framework */, 409 | 9C1FE7E81DC6D16600E57403 /* TSBackgroundFetch.framework */, 410 | ); 411 | name = Frameworks; 412 | sourceTree = ""; 413 | }; 414 | 9C1FE7ED1DC6D42D00E57403 /* Products */ = { 415 | isa = PBXGroup; 416 | children = ( 417 | 9C1FE7F11DC6D42D00E57403 /* libRCTAppleHealthKit.a */, 418 | ); 419 | name = Products; 420 | sourceTree = ""; 421 | }; 422 | /* End PBXGroup section */ 423 | 424 | /* Begin PBXNativeTarget section */ 425 | 00E356ED1AD99517003FC87E /* healthPulseTests */ = { 426 | isa = PBXNativeTarget; 427 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "healthPulseTests" */; 428 | buildPhases = ( 429 | 00E356EA1AD99517003FC87E /* Sources */, 430 | 00E356EB1AD99517003FC87E /* Frameworks */, 431 | 00E356EC1AD99517003FC87E /* Resources */, 432 | ); 433 | buildRules = ( 434 | ); 435 | dependencies = ( 436 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 437 | ); 438 | name = healthPulseTests; 439 | productName = healthPulseTests; 440 | productReference = 00E356EE1AD99517003FC87E /* healthPulseTests.xctest */; 441 | productType = "com.apple.product-type.bundle.unit-test"; 442 | }; 443 | 13B07F861A680F5B00A75B9A /* healthPulse */ = { 444 | isa = PBXNativeTarget; 445 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "healthPulse" */; 446 | buildPhases = ( 447 | 13B07F871A680F5B00A75B9A /* Sources */, 448 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 449 | 13B07F8E1A680F5B00A75B9A /* Resources */, 450 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 451 | ); 452 | buildRules = ( 453 | ); 454 | dependencies = ( 455 | ); 456 | name = healthPulse; 457 | productName = "Hello World"; 458 | productReference = 13B07F961A680F5B00A75B9A /* healthPulse.app */; 459 | productType = "com.apple.product-type.application"; 460 | }; 461 | /* End PBXNativeTarget section */ 462 | 463 | /* Begin PBXProject section */ 464 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 465 | isa = PBXProject; 466 | attributes = { 467 | LastUpgradeCheck = 0610; 468 | ORGANIZATIONNAME = Facebook; 469 | TargetAttributes = { 470 | 00E356ED1AD99517003FC87E = { 471 | CreatedOnToolsVersion = 6.2; 472 | DevelopmentTeam = SF87CBF59Z; 473 | TestTargetID = 13B07F861A680F5B00A75B9A; 474 | }; 475 | 13B07F861A680F5B00A75B9A = { 476 | DevelopmentTeam = SF87CBF59Z; 477 | SystemCapabilities = { 478 | com.apple.BackgroundModes = { 479 | enabled = 1; 480 | }; 481 | com.apple.HealthKit = { 482 | enabled = 1; 483 | }; 484 | }; 485 | }; 486 | }; 487 | }; 488 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "healthPulse" */; 489 | compatibilityVersion = "Xcode 3.2"; 490 | developmentRegion = English; 491 | hasScannedForEncodings = 0; 492 | knownRegions = ( 493 | en, 494 | Base, 495 | ); 496 | mainGroup = 83CBB9F61A601CBA00E9B192; 497 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 498 | projectDirPath = ""; 499 | projectReferences = ( 500 | { 501 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; 502 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 503 | }, 504 | { 505 | ProductGroup = 9C1FE7ED1DC6D42D00E57403 /* Products */; 506 | ProjectRef = 9C1FE7EC1DC6D42D00E57403 /* RCTAppleHealthKit.xcodeproj */; 507 | }, 508 | { 509 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; 510 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 511 | }, 512 | { 513 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; 514 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 515 | }, 516 | { 517 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; 518 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 519 | }, 520 | { 521 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; 522 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 523 | }, 524 | { 525 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; 526 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 527 | }, 528 | { 529 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; 530 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 531 | }, 532 | { 533 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; 534 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 535 | }, 536 | { 537 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */; 538 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 539 | }, 540 | { 541 | ProductGroup = 146834001AC3E56700842450 /* Products */; 542 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; 543 | }, 544 | { 545 | ProductGroup = 9C1FE7C11DC6D11B00E57403 /* Products */; 546 | ProjectRef = 9C1FE7C01DC6D11B00E57403 /* RNBackgroundFetch.xcodeproj */; 547 | }, 548 | ); 549 | projectRoot = ""; 550 | targets = ( 551 | 13B07F861A680F5B00A75B9A /* healthPulse */, 552 | 00E356ED1AD99517003FC87E /* healthPulseTests */, 553 | ); 554 | }; 555 | /* End PBXProject section */ 556 | 557 | /* Begin PBXReferenceProxy section */ 558 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { 559 | isa = PBXReferenceProxy; 560 | fileType = archive.ar; 561 | path = libRCTActionSheet.a; 562 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; 563 | sourceTree = BUILT_PRODUCTS_DIR; 564 | }; 565 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { 566 | isa = PBXReferenceProxy; 567 | fileType = archive.ar; 568 | path = libRCTGeolocation.a; 569 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; 570 | sourceTree = BUILT_PRODUCTS_DIR; 571 | }; 572 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { 573 | isa = PBXReferenceProxy; 574 | fileType = archive.ar; 575 | path = libRCTImage.a; 576 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; 577 | sourceTree = BUILT_PRODUCTS_DIR; 578 | }; 579 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { 580 | isa = PBXReferenceProxy; 581 | fileType = archive.ar; 582 | path = libRCTNetwork.a; 583 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; 584 | sourceTree = BUILT_PRODUCTS_DIR; 585 | }; 586 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { 587 | isa = PBXReferenceProxy; 588 | fileType = archive.ar; 589 | path = libRCTVibration.a; 590 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; 591 | sourceTree = BUILT_PRODUCTS_DIR; 592 | }; 593 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { 594 | isa = PBXReferenceProxy; 595 | fileType = archive.ar; 596 | path = libRCTSettings.a; 597 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; 598 | sourceTree = BUILT_PRODUCTS_DIR; 599 | }; 600 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { 601 | isa = PBXReferenceProxy; 602 | fileType = archive.ar; 603 | path = libRCTWebSocket.a; 604 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; 605 | sourceTree = BUILT_PRODUCTS_DIR; 606 | }; 607 | 146834041AC3E56700842450 /* libReact.a */ = { 608 | isa = PBXReferenceProxy; 609 | fileType = archive.ar; 610 | path = libReact.a; 611 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; 612 | sourceTree = BUILT_PRODUCTS_DIR; 613 | }; 614 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { 615 | isa = PBXReferenceProxy; 616 | fileType = archive.ar; 617 | path = libRCTLinking.a; 618 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; 619 | sourceTree = BUILT_PRODUCTS_DIR; 620 | }; 621 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { 622 | isa = PBXReferenceProxy; 623 | fileType = archive.ar; 624 | path = libRCTText.a; 625 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; 626 | sourceTree = BUILT_PRODUCTS_DIR; 627 | }; 628 | 9C1FE7C81DC6D11C00E57403 /* libRCTImage-tvOS.a */ = { 629 | isa = PBXReferenceProxy; 630 | fileType = archive.ar; 631 | path = "libRCTImage-tvOS.a"; 632 | remoteRef = 9C1FE7C71DC6D11C00E57403 /* PBXContainerItemProxy */; 633 | sourceTree = BUILT_PRODUCTS_DIR; 634 | }; 635 | 9C1FE7CC1DC6D11C00E57403 /* libRCTLinking-tvOS.a */ = { 636 | isa = PBXReferenceProxy; 637 | fileType = archive.ar; 638 | path = "libRCTLinking-tvOS.a"; 639 | remoteRef = 9C1FE7CB1DC6D11C00E57403 /* PBXContainerItemProxy */; 640 | sourceTree = BUILT_PRODUCTS_DIR; 641 | }; 642 | 9C1FE7D01DC6D11C00E57403 /* libRCTNetwork-tvOS.a */ = { 643 | isa = PBXReferenceProxy; 644 | fileType = archive.ar; 645 | path = "libRCTNetwork-tvOS.a"; 646 | remoteRef = 9C1FE7CF1DC6D11C00E57403 /* PBXContainerItemProxy */; 647 | sourceTree = BUILT_PRODUCTS_DIR; 648 | }; 649 | 9C1FE7D41DC6D11C00E57403 /* libRCTSettings-tvOS.a */ = { 650 | isa = PBXReferenceProxy; 651 | fileType = archive.ar; 652 | path = "libRCTSettings-tvOS.a"; 653 | remoteRef = 9C1FE7D31DC6D11C00E57403 /* PBXContainerItemProxy */; 654 | sourceTree = BUILT_PRODUCTS_DIR; 655 | }; 656 | 9C1FE7D81DC6D11C00E57403 /* libRCTText-tvOS.a */ = { 657 | isa = PBXReferenceProxy; 658 | fileType = archive.ar; 659 | path = "libRCTText-tvOS.a"; 660 | remoteRef = 9C1FE7D71DC6D11C00E57403 /* PBXContainerItemProxy */; 661 | sourceTree = BUILT_PRODUCTS_DIR; 662 | }; 663 | 9C1FE7DD1DC6D11C00E57403 /* libRCTWebSocket-tvOS.a */ = { 664 | isa = PBXReferenceProxy; 665 | fileType = archive.ar; 666 | path = "libRCTWebSocket-tvOS.a"; 667 | remoteRef = 9C1FE7DC1DC6D11C00E57403 /* PBXContainerItemProxy */; 668 | sourceTree = BUILT_PRODUCTS_DIR; 669 | }; 670 | 9C1FE7E11DC6D11C00E57403 /* libReact-tvOS.a */ = { 671 | isa = PBXReferenceProxy; 672 | fileType = archive.ar; 673 | path = "libReact-tvOS.a"; 674 | remoteRef = 9C1FE7E01DC6D11C00E57403 /* PBXContainerItemProxy */; 675 | sourceTree = BUILT_PRODUCTS_DIR; 676 | }; 677 | 9C1FE7E51DC6D11C00E57403 /* libRNBackgroundFetch.a */ = { 678 | isa = PBXReferenceProxy; 679 | fileType = archive.ar; 680 | path = libRNBackgroundFetch.a; 681 | remoteRef = 9C1FE7E41DC6D11C00E57403 /* PBXContainerItemProxy */; 682 | sourceTree = BUILT_PRODUCTS_DIR; 683 | }; 684 | 9C1FE7F11DC6D42D00E57403 /* libRCTAppleHealthKit.a */ = { 685 | isa = PBXReferenceProxy; 686 | fileType = archive.ar; 687 | path = libRCTAppleHealthKit.a; 688 | remoteRef = 9C1FE7F01DC6D42D00E57403 /* PBXContainerItemProxy */; 689 | sourceTree = BUILT_PRODUCTS_DIR; 690 | }; 691 | /* End PBXReferenceProxy section */ 692 | 693 | /* Begin PBXResourcesBuildPhase section */ 694 | 00E356EC1AD99517003FC87E /* Resources */ = { 695 | isa = PBXResourcesBuildPhase; 696 | buildActionMask = 2147483647; 697 | files = ( 698 | ); 699 | runOnlyForDeploymentPostprocessing = 0; 700 | }; 701 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 702 | isa = PBXResourcesBuildPhase; 703 | buildActionMask = 2147483647; 704 | files = ( 705 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 706 | ); 707 | runOnlyForDeploymentPostprocessing = 0; 708 | }; 709 | /* End PBXResourcesBuildPhase section */ 710 | 711 | /* Begin PBXShellScriptBuildPhase section */ 712 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 713 | isa = PBXShellScriptBuildPhase; 714 | buildActionMask = 2147483647; 715 | files = ( 716 | ); 717 | inputPaths = ( 718 | ); 719 | name = "Bundle React Native code and images"; 720 | outputPaths = ( 721 | ); 722 | runOnlyForDeploymentPostprocessing = 0; 723 | shellPath = /bin/sh; 724 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 725 | }; 726 | /* End PBXShellScriptBuildPhase section */ 727 | 728 | /* Begin PBXSourcesBuildPhase section */ 729 | 00E356EA1AD99517003FC87E /* Sources */ = { 730 | isa = PBXSourcesBuildPhase; 731 | buildActionMask = 2147483647; 732 | files = ( 733 | 00E356F31AD99517003FC87E /* healthPulseTests.m in Sources */, 734 | ); 735 | runOnlyForDeploymentPostprocessing = 0; 736 | }; 737 | 13B07F871A680F5B00A75B9A /* Sources */ = { 738 | isa = PBXSourcesBuildPhase; 739 | buildActionMask = 2147483647; 740 | files = ( 741 | 9C1FE7EB1DC6D20F00E57403 /* RNBackgroundFetch+AppDelegate.m in Sources */, 742 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 743 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 744 | ); 745 | runOnlyForDeploymentPostprocessing = 0; 746 | }; 747 | /* End PBXSourcesBuildPhase section */ 748 | 749 | /* Begin PBXTargetDependency section */ 750 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 751 | isa = PBXTargetDependency; 752 | target = 13B07F861A680F5B00A75B9A /* healthPulse */; 753 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 754 | }; 755 | /* End PBXTargetDependency section */ 756 | 757 | /* Begin XCBuildConfiguration section */ 758 | 00E356F61AD99517003FC87E /* Debug */ = { 759 | isa = XCBuildConfiguration; 760 | buildSettings = { 761 | BUNDLE_LOADER = "$(TEST_HOST)"; 762 | DEVELOPMENT_TEAM = SF87CBF59Z; 763 | GCC_PREPROCESSOR_DEFINITIONS = ( 764 | "DEBUG=1", 765 | "$(inherited)", 766 | ); 767 | INFOPLIST_FILE = healthPulseTests/Info.plist; 768 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 769 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 770 | PRODUCT_NAME = "$(TARGET_NAME)"; 771 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/healthPulse.app/healthPulse"; 772 | }; 773 | name = Debug; 774 | }; 775 | 00E356F71AD99517003FC87E /* Release */ = { 776 | isa = XCBuildConfiguration; 777 | buildSettings = { 778 | BUNDLE_LOADER = "$(TEST_HOST)"; 779 | COPY_PHASE_STRIP = NO; 780 | DEVELOPMENT_TEAM = SF87CBF59Z; 781 | INFOPLIST_FILE = healthPulseTests/Info.plist; 782 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 783 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 784 | PRODUCT_NAME = "$(TARGET_NAME)"; 785 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/healthPulse.app/healthPulse"; 786 | }; 787 | name = Release; 788 | }; 789 | 13B07F941A680F5B00A75B9A /* Debug */ = { 790 | isa = XCBuildConfiguration; 791 | buildSettings = { 792 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 793 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 794 | CODE_SIGN_ENTITLEMENTS = healthPulse/healthPulse.entitlements; 795 | CURRENT_PROJECT_VERSION = 1; 796 | DEAD_CODE_STRIPPING = NO; 797 | DEVELOPMENT_TEAM = SF87CBF59Z; 798 | "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( 799 | "$(SRCROOT)", 800 | "$(SRCROOT)/../node_modules/react-native-background-fetch/ios/**", 801 | ); 802 | HEADER_SEARCH_PATHS = ( 803 | "$(inherited)", 804 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 805 | "$(SRCROOT)/../node_modules/react-native/React/**", 806 | "$(SRCROOT)/../../../React/**", 807 | ); 808 | INFOPLIST_FILE = healthPulse/Info.plist; 809 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 810 | OTHER_LDFLAGS = ( 811 | "$(inherited)", 812 | "-ObjC", 813 | "-lc++", 814 | ); 815 | PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.example.healthpulse; 816 | PRODUCT_NAME = healthPulse; 817 | VERSIONING_SYSTEM = "apple-generic"; 818 | }; 819 | name = Debug; 820 | }; 821 | 13B07F951A680F5B00A75B9A /* Release */ = { 822 | isa = XCBuildConfiguration; 823 | buildSettings = { 824 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 825 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 826 | CODE_SIGN_ENTITLEMENTS = healthPulse/healthPulse.entitlements; 827 | CURRENT_PROJECT_VERSION = 1; 828 | DEVELOPMENT_TEAM = SF87CBF59Z; 829 | "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( 830 | "$(SRCROOT)/../node_modules/react-native-background-fetch/ios/**", 831 | "$(SRCROOT)", 832 | ); 833 | HEADER_SEARCH_PATHS = ( 834 | "$(inherited)", 835 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 836 | "$(SRCROOT)/../node_modules/react-native/React/**", 837 | "$(SRCROOT)/../../../React/**", 838 | ); 839 | INFOPLIST_FILE = healthPulse/Info.plist; 840 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 841 | OTHER_LDFLAGS = ( 842 | "$(inherited)", 843 | "-ObjC", 844 | "-lc++", 845 | ); 846 | PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.example.healthpulse; 847 | PRODUCT_NAME = healthPulse; 848 | VERSIONING_SYSTEM = "apple-generic"; 849 | }; 850 | name = Release; 851 | }; 852 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 853 | isa = XCBuildConfiguration; 854 | buildSettings = { 855 | ALWAYS_SEARCH_USER_PATHS = NO; 856 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 857 | CLANG_CXX_LIBRARY = "libc++"; 858 | CLANG_ENABLE_MODULES = YES; 859 | CLANG_ENABLE_OBJC_ARC = YES; 860 | CLANG_WARN_BOOL_CONVERSION = YES; 861 | CLANG_WARN_CONSTANT_CONVERSION = YES; 862 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 863 | CLANG_WARN_EMPTY_BODY = YES; 864 | CLANG_WARN_ENUM_CONVERSION = YES; 865 | CLANG_WARN_INT_CONVERSION = YES; 866 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 867 | CLANG_WARN_UNREACHABLE_CODE = YES; 868 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 869 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 870 | COPY_PHASE_STRIP = NO; 871 | ENABLE_STRICT_OBJC_MSGSEND = YES; 872 | GCC_C_LANGUAGE_STANDARD = gnu99; 873 | GCC_DYNAMIC_NO_PIC = NO; 874 | GCC_OPTIMIZATION_LEVEL = 0; 875 | GCC_PREPROCESSOR_DEFINITIONS = ( 876 | "DEBUG=1", 877 | "$(inherited)", 878 | ); 879 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 880 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 881 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 882 | GCC_WARN_UNDECLARED_SELECTOR = YES; 883 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 884 | GCC_WARN_UNUSED_FUNCTION = YES; 885 | GCC_WARN_UNUSED_VARIABLE = YES; 886 | HEADER_SEARCH_PATHS = ( 887 | "$(inherited)", 888 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 889 | "$(SRCROOT)/../node_modules/react-native/React/**", 890 | ); 891 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 892 | MTL_ENABLE_DEBUG_INFO = YES; 893 | ONLY_ACTIVE_ARCH = YES; 894 | SDKROOT = iphoneos; 895 | }; 896 | name = Debug; 897 | }; 898 | 83CBBA211A601CBA00E9B192 /* Release */ = { 899 | isa = XCBuildConfiguration; 900 | buildSettings = { 901 | ALWAYS_SEARCH_USER_PATHS = NO; 902 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 903 | CLANG_CXX_LIBRARY = "libc++"; 904 | CLANG_ENABLE_MODULES = YES; 905 | CLANG_ENABLE_OBJC_ARC = YES; 906 | CLANG_WARN_BOOL_CONVERSION = YES; 907 | CLANG_WARN_CONSTANT_CONVERSION = YES; 908 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 909 | CLANG_WARN_EMPTY_BODY = YES; 910 | CLANG_WARN_ENUM_CONVERSION = YES; 911 | CLANG_WARN_INT_CONVERSION = YES; 912 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 913 | CLANG_WARN_UNREACHABLE_CODE = YES; 914 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 915 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 916 | COPY_PHASE_STRIP = YES; 917 | ENABLE_NS_ASSERTIONS = NO; 918 | ENABLE_STRICT_OBJC_MSGSEND = YES; 919 | GCC_C_LANGUAGE_STANDARD = gnu99; 920 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 921 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 922 | GCC_WARN_UNDECLARED_SELECTOR = YES; 923 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 924 | GCC_WARN_UNUSED_FUNCTION = YES; 925 | GCC_WARN_UNUSED_VARIABLE = YES; 926 | HEADER_SEARCH_PATHS = ( 927 | "$(inherited)", 928 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 929 | "$(SRCROOT)/../node_modules/react-native/React/**", 930 | ); 931 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 932 | MTL_ENABLE_DEBUG_INFO = NO; 933 | SDKROOT = iphoneos; 934 | VALIDATE_PRODUCT = YES; 935 | }; 936 | name = Release; 937 | }; 938 | /* End XCBuildConfiguration section */ 939 | 940 | /* Begin XCConfigurationList section */ 941 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "healthPulseTests" */ = { 942 | isa = XCConfigurationList; 943 | buildConfigurations = ( 944 | 00E356F61AD99517003FC87E /* Debug */, 945 | 00E356F71AD99517003FC87E /* Release */, 946 | ); 947 | defaultConfigurationIsVisible = 0; 948 | defaultConfigurationName = Release; 949 | }; 950 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "healthPulse" */ = { 951 | isa = XCConfigurationList; 952 | buildConfigurations = ( 953 | 13B07F941A680F5B00A75B9A /* Debug */, 954 | 13B07F951A680F5B00A75B9A /* Release */, 955 | ); 956 | defaultConfigurationIsVisible = 0; 957 | defaultConfigurationName = Release; 958 | }; 959 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "healthPulse" */ = { 960 | isa = XCConfigurationList; 961 | buildConfigurations = ( 962 | 83CBBA201A601CBA00E9B192 /* Debug */, 963 | 83CBBA211A601CBA00E9B192 /* Release */, 964 | ); 965 | defaultConfigurationIsVisible = 0; 966 | defaultConfigurationName = Release; 967 | }; 968 | /* End XCConfigurationList section */ 969 | }; 970 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 971 | } 972 | --------------------------------------------------------------------------------