Skip to content

Commit

Permalink
Merge pull request #106 from EvanBacon/@evanbacon/config-plugin
Browse files Browse the repository at this point in the history
Created Expo config plugin
  • Loading branch information
macelai authored Jun 2, 2021
2 parents 593ec80 + a3792c2 commit 2a71b55
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 0 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ A React Native package to interact with Apple HealthKit for iOS.

## Getting Started

> 🚨 Expo: This package is not available in the [Expo Go](https://expo.io/client) app. Learn how you can use it with [custom dev clients](/docs/Expo.md).
### Automatic Installation

1. Install the react-native-health package from [npm](https://www.npmjs.com/package/react-native-health)
Expand Down
49 changes: 49 additions & 0 deletions app.plugin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const { withEntitlementsPlist, withInfoPlist } = require('@expo/config-plugins')

const HEALTH_SHARE = 'Allow $(PRODUCT_NAME) to check health info'
const HEALTH_UPDATE = 'Allow $(PRODUCT_NAME) to update health info'

const withHealthKit = (
config,
{ healthSharePermission, healthUpdatePermission, isClinicalDataEnabled } = {},
) => {
// Add permissions
config = withInfoPlist(config, (config) => {
config.modResults.NSHealthShareUsageDescription =
healthSharePermission ||
config.modResults.NSHealthShareUsageDescription ||
HEALTH_SHARE
config.modResults.NSHealthUpdateUsageDescription =
healthUpdatePermission ||
config.modResults.NSHealthUpdateUsageDescription ||
HEALTH_UPDATE

return config
})

// Add entitlements. These are automatically synced when using EAS build for production apps.
config = withEntitlementsPlist(config, (config) => {
config.modResults['com.apple.developer.healthkit'] = true
if (
!Array.isArray(config.modResults['com.apple.developer.healthkit.access'])
) {
config.modResults['com.apple.developer.healthkit.access'] = []
}

if (isClinicalDataEnabled) {
config.modResults['com.apple.developer.healthkit.access'].push(
'health-records',
)

// Remove duplicates
config.modResults['com.apple.developer.healthkit.access'] = [
...new Set(config.modResults['com.apple.developer.healthkit.access']),
]
}

return config
})

return config
}
module.exports = withHealthKit
59 changes: 59 additions & 0 deletions docs/Expo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Expo installation

> This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/).
First install the package with yarn, npm, or [`expo install`](https://docs.expo.io/workflow/expo-cli/#expo-install).

```sh
expo install react-native-health
```

After installing this npm package, add the [config plugin](https://docs.expo.io/guides/config-plugins/) to the [`plugins`](https://docs.expo.io/versions/latest/config/app/#plugins) array of your `app.json` or `app.config.js`:

```json
{
"expo": {
"plugins": ["react-native-health"]
}
}
```

Next, rebuild your app as described in the ["Adding custom native code"](https://docs.expo.io/workflow/customizing/) guide.

## API

The plugin provides props for extra customization. Every time you change the props or plugins, you'll need to rebuild (and `prebuild`) the native app. If no extra properties are added, defaults will be used.

- `healthSharePermission` (_string_): Sets the iOS `NSHealthShareUsageDescription` permission message to the `Info.plist`. Defaults to `Allow $(PRODUCT_NAME) to check health info`.
- `healthUpdatePermission` (_string_): Sets the iOS `NSHealthUpdateUsageDescription` permission message to the `Info.plist`. Defaults to `Allow $(PRODUCT_NAME) to update health info`.
- `isClinicalDataEnabled` (_boolean_): Adds `health-records` to the `com.apple.developer.healthkit.access` entitlement in the iOS project. Defaults to false.

`app.config.js`

```json
{
"expo": {
"plugins": [
[
"react-native-health",
{
"isClinicalDataEnabled": true,
"healthSharePermission": "Custom health share permission",
"healthUpdatePermission": "Custom health update permission"
}
]
]
}
}
```

## Background Processing

Background processing is not currently supported by this plugin.

## Capabilities

This plugin will enable the iOS `com.apple.developer.healthkit` entitlement, but in order to sync this with the bundle identifier' production capabilities you'll need to do one of two things:

- Automatic: Build the app with [EAS build](https://docs.expo.io/build/introduction/)
- Manual: Visit [Apple developer portal](https://developer.apple.com/account/resources/identifiers/list) and enable the HealthKit capability for your bundle identifier before building for production. This can also be done via Xcode.
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,8 @@
},
"peerDependencies": {
"react-native": ">=0.40.0"
},
"dependencies": {
"@expo/config-plugins": "^2.0.0"
}
}

0 comments on commit 2a71b55

Please sign in to comment.