Expo SDK 36 is now available
Expo’s Holiday release, 🌟🎄SDK v36.0.0🎄🌟, is out today! SDK 36 is based on React Native 0.61.4.
SDK 36 is a maintenance release: along with the new version of React Native, it includes many bugfixes, consistency improvements, and quality of life enhancements. We think that, even without flashy new features, the numerous smaller fixes you’ll find in SDK 36 add up to a pretty exciting and noteworthy new version.
🗣 Want to opine on Expo and other parts of the JavaScript world? Take the State of JS 2019 survey! (Expo appears in the “Mobile & Desktop” category.)
⚛️ React Native 0.61
SDK 36 includes many of the new features and improvements that are part of React Native 0.60 and 0.61. This includes:
- Fast Refresh, a new way to reload your projects in development that combines the best of Live Reload and Hot Reload;
- Accessibility improvements across both Android and iOS;
- React 16.9, which includes bugfixes, testing improvements,
Profiler
, and deprecated lifecycle method names;
and lots more! Check out the React Native changelog for more details.
🌃 Dark Mode on Android and Web
In SDK 35, we released support for Dark Mode on iOS with the react-native-appearance
module. We’ve now extended support for Dark Mode to Android and Web!
You can use the react-native-appearance
module to listen to your users’ appearance preferences and update your UI accordingly. (Check out the Appearance
module docs for more information.) And, if you’re using React Navigation, you can enable a built-in dark theme for your navigation components; see the Themes documentation for more detail.
![](https://miro.medium.com/v2/resize:fit:700/1*L4jVDM2ECRmR4zx6GppXsg.png)
🔑 Reworked Permissions API
In the past, all runtime permissions requests went through the Permissions
API, which includes methods and constants for requesting every possible permission Expo can use. This meant that you needed to import from expo-permissions
in every file that needed to request permissions from a user.
No more! Now, each module that needs user-facing permissions includes its own methods for requesting and checking the status of permissions. For example, if you use the MediaLibrary
API, you can use MediaLibrary.requestPermissionsAsync()
.
The Permissions
module is still available for backwards compatibility and isn’t going anywhere! We’re simply providing these new methods for your convenience 🙂
🐛 Bug Hunt
Throughout October and November, we closed over 350 issues across the expo
and expo-cli
repos. In the process, we fixed quite a few bugs and inconsistencies across all of our modules, so you might notice things working ever so slightly better than before! Check out our changelog for a detailed list of all the fixes.
🌟 2020 Plans for the Bare Workflow and ExpoKit
We heard your feedback about issues with ExpoKit, and throughout 2019 we’ve been hard at work on a better story for developers who need more customization in their app than we can provide with the Managed workflow.
We landed on the Bare workflow, a way to use Expo APIs in any React Native app. Since we first announced it in February, we’ve extracted almost all of our 60+ modules into unimodules you can use with the Bare workflow, added a number of guides, and collected developer feedback along the way. We’re confident that moving forward, the Bare workflow is the best way to customize your Expo app.
We’re not quite yet at feature parity between ExpoKit and the Bare workflow. Some modules included in ExpoKit (such as Updates
, SplashScreen
, and TaskManager
) are not yet supported in the Bare workflow. However, we’re at work on all of these and expect to introduce solutions for the Bare workflow in 2020. Once we do, we’ll phase out ExpoKit to focus entirely on the Bare and Managed workflows.
Nothing is changing right now with ExpoKit support — however, if you’re thinking about ejecting to ExpoKit in a new project, we highly recommend you check out the other options first to see whether they’ll meet your needs!
🛠 API improvements and additions
Facebook module initialization
To prevent unintended data collection, the Facebook
module no longer auto-initializes when your app starts up. If your app uses Facebook login, you must initialize the Facebook SDK manually, either at runtime or with an app.json setting, before calling logInWithReadPermissionsAsync
. See the docs for more information.
ErrorRecovery unimodule
The ErrorRecovery
module has now been extracted to a unimodule, expo-error-recovery
. All imports will need to be updated accordingly. On the plus side, you can now use this module in Bare workflow projects!
Web support improvements
We’ve added better web support to a number of our modules, including more types of Permissions
and more functionality and browser support for Camera
. You can see Platform Compatibility info for each module in our docs. Try out web support in a new Expo project (just run expo start --web
) to play around with these improvements!
![](https://miro.medium.com/v2/resize:fit:700/1*Nra9plFi9Mnk3GlWQSH4qg.png)
Android FileSystem.documentDirectory migration
In SDK 33, we changed the behind-the-scenes location of FileSystem.documentDirectory
for Android standalone apps. It came to our attention that the migration was not smooth for all users. 😞 If you’ve been affected by issue #4537, upgrading to SDK 36 should fix issues with file migration. We’re sorry this process was not as smooth as we’d like and we hope to do better in the future.
We do highly recommend (as always) that you test all standalone app upgrades before rolling out to production!
Other fixes and improvements
There are lots of other changes included in this release! Check out the full list on our changelog.
Library updates & breaking changes
Historically, we’ve listed these in the release notes; now you can check them out on our changelog!
🔒 TLS 1.2/1.3 requirement
This is a reminder that from January 13, 2020, onward, Expo’s servers will require HTTPS connections to use TLS 1.2 or 1.3 and will drop support for TLS 1.0 and 1.1.
You are probably already using TLS 1.2 and this will not affect most developers. (Over 99% of the connections to Expo use modern TLS.) However, if you have servers that connect to Expo to send push notifications, publish updates, or start builds, we recommend double-checking that you use TLS 1.2 (e.g. test that your server can connect to sites like https://tls-v1-2.badssl.com:1012/).
You can read more about this change in our original announcement.
Upgrading Your App
Here’s how to upgrade your app to Expo SDK 36.0.0 from 35.0.0:
- Run
expo upgrade
in your project directory (requires the latest version ofexpo-cli
, you can update withnpm i -g expo-cli
). CameraRoll
andART
have both been removed from thereact-native
package, developers are encouraged to useexpo-media-library
andreact-native-svg
instead- Make sure to check the changelog for other breaking changes!
- Update the Expo app on your phones from the App Store / Google Play.
expo-cli
will automatically update your apps in simulators if you delete the existing apps, or you can runexpo client:install:ios
andexpo client:install:android
. - If you built a standalone app previously, remember that you will need to create a new build in order to update the SDK version. Run
expo build:ios
and/orexpo build:android
when you are ready to do a new build for submission to stores.
Updating ExpoKit to SDK 36
- Follow the instructions given in the docs.