expo-updates
Advanced tools
Comparing version 0.0.1-rc.3 to 0.1.0
{ | ||
"name": "expo-updates", | ||
"version": "0.0.1-rc.3", | ||
"version": "0.1.0", | ||
"description": "Fetches and manages remotely-hosted assets and updates to your app's JS bundle.", | ||
@@ -40,6 +40,9 @@ "main": "build/index.js", | ||
}, | ||
"dependencies": { | ||
"fbemitter": "^2.1.1" | ||
}, | ||
"devDependencies": { | ||
"expo-module-scripts": "~1.2.0" | ||
}, | ||
"gitHead": "e6fa3c621d15ad97525ce4d2f6e16d927994dc94" | ||
"gitHead": "691527b37b3ecf241c65db632bfe70b3bbb5da24" | ||
} |
143
README.md
@@ -13,2 +13,8 @@ # expo-updates | ||
## Compatibility | ||
This module requires `expo-cli@3.16.1` or later; make sure your global installation is at least this version before proceeding. | ||
Additionally, this module is only compatible with Expo SDK 37 or later. For bare workflow projects, if the `expo` package is installed, it must be version `37.0.2` or later. | ||
### Add the package to your npm dependencies | ||
@@ -20,20 +26,36 @@ | ||
### Setup app.json | ||
### `expo-asset` | ||
Expo can automatically bundle your most recent update into your iOS and Android binaries, so that users can launch your app immediately for the first time without needing an internet connection. Add the following fields under the `expo` key in your project's app.json: | ||
(If you have the `expo` package installed in your project already and use `registerRootComponent` in your project entry point, you can skip this section!) | ||
If you have assets (such as images or other media) that are `require`d in your application code, and you'd like these to be included in updates, you'll also need to install the `expo-asset` helper package: | ||
``` | ||
expo install expo-asset | ||
``` | ||
Additionally, add the following line in your root `index.js` or `App.js` file: | ||
```js | ||
import 'expo-asset'; | ||
``` | ||
### Set up app.json | ||
If you're going to be using Expo CLI to package your updates (either with `expo export` or `expo publish`), you will need to add some fields to your app.json. If not, you can skip this section. | ||
First, if your app.json file does not yet include an `expo` key, add it with the following fields: | ||
```json | ||
"ios": { | ||
"publishBundlePath": "ios/<your-project-name>/Supporting/shell-app.bundle", | ||
"publishManifestPath": "ios/<your-project-name>/Supporting/shell-app-manifest.json" | ||
}, | ||
"android": { | ||
"publishBundlePath": "android/app/src/main/assets/shell-app.bundle", | ||
"publishManifestPath": "android/app/src/main/assets/shell-app-manifest.json" | ||
}, | ||
"expo": { | ||
"name": "<your app name -- must match your iOS project folder name>", | ||
"slug": "<string that uniquely identifies your app>", | ||
"privacy": "unlisted", | ||
"sdkVersion": "<SDK version of your app. See note below>", | ||
} | ||
``` | ||
Additionally, ensure that these directories (`ios/<your-project-name>/Supporting/` and `android/app/src/main/assets/`) exist. After running `expo publish` at least once, you'll need to manually add the `shell-app.bundle` and `shell-app-manifest.json` files to your Xcode project. | ||
Currently, all apps published to Expo's servers must be configured with a valid SDK version. We use the SDK version to determine which app binaries a particular update is compatible with. If your app has the `expo` package installed in package.json, your SDK version should match the major version number of this package. Otherwise, you can just use the latest Expo SDK version number (at least `37.0.0`). | ||
Finally, if you have other assets (such as images or other media) that are `require`d in your application code and you would like these to also be bundled into your application binary, add the `assetBundlePatterns` field under the `expo` key in your project's app.json. This field should be an array of file glob strings which point to the assets you want bundled. For example: | ||
Finally, if you installed `expo-asset` and have other assets (such as images or other media) that are `require`d in your application code, and you would like these to also be bundled into your application binary, add the `assetBundlePatterns` field under the `expo` key in your project's app.json. This field should be an array of file glob strings which point to the assets you want bundled. For example: | ||
@@ -56,2 +78,4 @@ ```json | ||
This will configure your project to bundle assets from your published update when making release mode builds. For more information, see the section below on [Embedded Assets](#embedded-assets). | ||
#### `Expo.plist` | ||
@@ -74,5 +98,12 @@ | ||
EXUpdatesURL is the remote URL at which your app will be hosted, and to which expo-updates will query for new updates. EXUpdatesSDKVersion should match the SDK version in your app.json. | ||
If you use `expo export` or `expo publish` to create your update, it will fill in the proper values here for you (given the file exists), so you don't need to set these values right now. | ||
#### `AppDelegate.h` | ||
In this file, you need to import the `EXUpdatesAppController` header and add `EXUpdatesAppControllerDelegate` as a protocol of your `AppDelegate`. A diff for a typical bare project might look like this (but yours might look different): | ||
```diff | ||
+#import <EXUpdates/EXUpdatesAppController.h> | ||
#import <React/RCTBridgeDelegate.h> | ||
@@ -82,4 +113,2 @@ #import <UMCore/UMAppDelegateWrapper.h> | ||
-@interface AppDelegate : UMAppDelegateWrapper <RCTBridgeDelegate> | ||
+#import <EXUpdates/EXUpdatesAppController.h> | ||
+ | ||
+@interface AppDelegate : UMAppDelegateWrapper <RCTBridgeDelegate, EXUpdatesAppControllerDelegate> | ||
@@ -175,6 +204,12 @@ | ||
Make the following change in order to bundle assets from expo-updates instead of your local metro server. | ||
Make the following change in order to bundle assets from expo-updates instead of your local metro server when making release mode builds. For more information, see the section below on [Embedded Assets](#embedded-assets). | ||
```diff | ||
-apply from: "../../node_modules/react-native/react.gradle" | ||
project.ext.react = [ | ||
entryFile: "index.js", | ||
+ bundleInRelease: false, | ||
enableHermes: false | ||
] | ||
apply from: "../../node_modules/react-native/react.gradle" | ||
+apply from: "../../node_modules/expo-updates/expo-updates.gradle" | ||
@@ -192,2 +227,6 @@ ``` | ||
EXPO_UPDATE_URL is the remote URL at which your app will be hosted, and to which expo-updates will query for new updates. EXPO_SDK_VERSION should match the SDK version in your app.json. | ||
As with iOS, if you use `expo export` or `expo publish` to create your update, it will fill in the proper values here for you (given the file exists), so you don't need to set these values right now. | ||
#### `MainApplication.java` | ||
@@ -197,2 +236,4 @@ | ||
If the diff doesn't apply cleanly, the important parts here are (1) overriding `getJSBundleFile()` and `getBundleAssetName()` from `ReactNativeHost` with the values provided by expo-updates, and (2) initializing `UpdatesController` as early as possible in the application's lifecycle. | ||
```diff | ||
@@ -245,2 +286,22 @@ +import android.net.Uri; | ||
## Embedded Assets | ||
In certain situations, assets that are `require`d by your JavaScript are embedded into your application binary by Xcode/Android Studio. This allows these assets to load when the packager server running locally on your machine is not available. | ||
Debug builds of Android apps do not, by default, have any assets bundled into the APK; they are always loaded at runtime from the Metro packager. | ||
Debug builds of iOS apps built for the iOS simulator also do not have assets bundled into the app. They are loaded at runtime from Metro. Debug builds of iOS apps built for a real device **do** have assets bundled into the app binary, so they can be loaded from disk if they cannot be loaded from the packager at runtime. | ||
Release builds of both iOS and Android apps include a full embedded update, including manifest, JavaScript bundle, and all `require`d assets. This is critical to ensure that your app can load for all users immediately upon installation, without needing to talk to a server first. | ||
Note that when you make a release build, the update that will run on first launch is the update whose manifest and bundle are embedded in the binary at build time -- i.e. your most recently exported/published update. **This is different behavior from plain React Native projects**, which create a new bundle on-demand each time you make a release build. This means that if you make a change to your JavaScript app, you need to export/publish a new update in order to see that change in a release build. In future versions of `expo-updates` we hope to support on-demand updates created at build-time. | ||
### Embed an initial update | ||
Before building an `expo-update`-enabled release build of your app, you need to create an initial update to embed into the app binary. | ||
If you're not using Expo CLI, you need to create a manifest and bundle for this initial update. The files should be named `app.manifest` and `app.bundle`. (See the documentation on [Updating your App](https://docs/expo.io/versions/latest/bare/updating-your-app/) for the format of the manifest.) To embed them into your Android project, place a copy in the `android/app/src/main/assets` folder. To embed them into your iOS app, place them in the `ios/<your-project-name>` folder (or any subfolder) and add them to your Xcode project in the Xcode GUI. | ||
If you're using Expo CLI, you just need to run `expo export` or `expo publish` once before making a release build. After doing so, be sure to **add `ios/<your-project-name>/Supporting/app.manifest` and `ios/<your-project-name>/Supporting/app.bundle` to your Xcode project**. | ||
## Configuration | ||
@@ -252,12 +313,44 @@ | ||
| iOS plist/dictionary key | Android Map key | Android meta-data name | Description | Default | Required? | | ||
| --- | --- | --- | --- | --- | --- | | ||
| `EXUpdatesEnabled` | `enabled` | `expo.modules.updates.ENABLED` | Whether updates are enabled. Setting this to `false` disables all update functionality, all module methods, and forces the app to load with the manifest and assets bundled into the app binary. | `true` | ❌ | | ||
| `EXUpdatesURL` | `updateUrl` | `expo.modules.updates.EXPO_UPDATE_URL` | URL to the remote server where the app should check for updates | (none) | ✅ | | ||
| `EXUpdatesSDKVersion` | `sdkVersion` | `expo.modules.updates.EXPO_SDK_VERSION` | SDK version to send under the `Expo-SDK-Version` header in the manifest request. Required for apps hosted on Expo's server. | (none) | (exactly one of `sdkVersion` or `runtimeVersion` is required) | | ||
| `EXUpdatesRuntimeVersion` | `runtimeVersion` | `expo.modules.updates.EXPO_RUNTIME_VERSION` | Runtime version to send under the `Expo-Runtime-Version` header in the manifest request. | (none) | (exactly one of `sdkVersion` or `runtimeVersion` is required) | | ||
| `EXUpdatesReleaseChannel` | `releaseChannel` | `expo.modules.updates.EXPO_RELEASE_CHANNEL` | Release channel to send under the `Expo-Release-Channel` header in the manifest request | `default` | ❌ | | ||
| `EXUpdatesCheckOnLaunch` | `checkOnLaunch` | `expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH` | Condition under which expo-updates should automatically check for (and download, if one exists) an update upon app launch. Possible values are `ALWAYS`, `NEVER` (if you want to exclusively control updates via this module's JS API), or `WIFI_ONLY` (if you want the app to automatically download updates only if the device is on an unmetered Wi-Fi connection when it launches). | `ALWAYS` | ❌ | | ||
| `EXUpdatesLaunchWaitMs` | `launchWaitMs` | `expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS` | Number of milliseconds expo-updates should delay the app launch and stay on the splash screen while trying to download an update, before falling back to a previously downloaded version. Setting this to `0` will cause the app to always launch with a previously downloaded update and will result in the fastest app launch possible. | `0` | ❌ | | ||
| iOS plist/dictionary key | Android Map key | Android meta-data name | Default | Required? | | ||
| --- | --- | --- | --- | --- | | ||
| `EXUpdatesEnabled` | `enabled` | `expo.modules.updates.ENABLED` | `true` | ❌ | | ||
Whether updates are enabled. Setting this to `false` disables all update functionality, all module methods, and forces the app to load with the manifest and assets bundled into the app binary. | ||
| iOS plist/dictionary key | Android Map key | Android meta-data name | Default | Required? | | ||
| --- | --- | --- | --- | --- | | ||
| `EXUpdatesURL` | `updateUrl` | `expo.modules.updates.EXPO_UPDATE_URL` | (none) | ✅ | | ||
URL to the remote server where the app should check for updates | ||
| iOS plist/dictionary key | Android Map key | Android meta-data name | Default | Required? | | ||
| --- | --- | --- | --- | --- | | ||
| `EXUpdatesSDKVersion` | `sdkVersion` | `expo.modules.updates.EXPO_SDK_VERSION` | (none) | (exactly one of `sdkVersion` or `runtimeVersion` is required) | | ||
SDK version to send under the `Expo-SDK-Version` header in the manifest request. Required for apps hosted on Expo's server. | ||
| iOS plist/dictionary key | Android Map key | Android meta-data name | Default | Required? | | ||
| --- | --- | --- | --- | --- | | ||
| `EXUpdatesRuntimeVersion` | `runtimeVersion` | `expo.modules.updates.EXPO_RUNTIME_VERSION` | (none) | (exactly one of `sdkVersion` or `runtimeVersion` is required) | | ||
Runtime version to send under the `Expo-Runtime-Version` header in the manifest request. | ||
| iOS plist/dictionary key | Android Map key | Android meta-data name | Default | Required? | | ||
| --- | --- | --- | --- | --- | | ||
| `EXUpdatesReleaseChannel` | `releaseChannel` | `expo.modules.updates.EXPO_RELEASE_CHANNEL` | `default` | ❌ | | ||
Release channel to send under the `Expo-Release-Channel` header in the manifest request | ||
| iOS plist/dictionary key | Android Map key | Android meta-data name | Default | Required? | | ||
| --- | --- | --- | --- | --- | | ||
| `EXUpdatesCheckOnLaunch` | `checkOnLaunch` | `expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH` | `ALWAYS` | ❌ | | ||
Condition under which expo-updates should automatically check for (and download, if one exists) an update upon app launch. Possible values are `ALWAYS`, `NEVER` (if you want to exclusively control updates via this module's JS API), or `WIFI_ONLY` (if you want the app to automatically download updates only if the device is on an unmetered Wi-Fi connection when it launches). | ||
| iOS plist/dictionary key | Android Map key | Android meta-data name | Default | Required? | | ||
| --- | --- | --- | --- | --- | | ||
| `EXUpdatesLaunchWaitMs` | `launchWaitMs` | `expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS` | `0` | ❌ | | ||
Number of milliseconds expo-updates should delay the app launch and stay on the splash screen while trying to download an update, before falling back to a previously downloaded version. Setting this to `0` will cause the app to always launch with a previously downloaded update and will result in the fastest app launch possible. | ||
## API | ||
@@ -264,0 +357,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
291812
432
0
1
+ Addedfbemitter@^2.1.1
+ Addedasap@2.0.6(transitive)
+ Addedcore-js@1.2.7(transitive)
+ Addedencoding@0.1.13(transitive)
+ Addedfbemitter@2.1.1(transitive)
+ Addedfbjs@0.8.18(transitive)
+ Addediconv-lite@0.6.3(transitive)
+ Addedis-stream@1.1.0(transitive)
+ Addedisomorphic-fetch@2.2.1(transitive)
+ Addedjs-tokens@4.0.0(transitive)
+ Addedloose-envify@1.4.0(transitive)
+ Addednode-fetch@1.7.3(transitive)
+ Addedobject-assign@4.1.1(transitive)
+ Addedpromise@7.3.1(transitive)
+ Addedsafer-buffer@2.1.2(transitive)
+ Addedsetimmediate@1.0.5(transitive)
+ Addedua-parser-js@0.7.39(transitive)
+ Addedwhatwg-fetch@3.6.20(transitive)