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.

Eric Samelson
Exposition
Published in
5 min readDec 9, 2019

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.

Dark and Light Modes in the Android Expo client

🔑 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!

We’ve added Platform Compatibility info for each module to our Expo Docs.

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 of expo-cli, you can update with npm i -g expo-cli).
  • CameraRoll and ART have both been removed from the react-native package, developers are encouraged to use expo-media-library and react-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 run expo client:install:ios and expo 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/or expo build:android when you are ready to do a new build for submission to stores.

Updating ExpoKit to SDK 36

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Published in Exposition

Old articles by the Expo team and community. Visit us at https://expo.dev/blog to stay up to date with Expo news and product announcements. Subscribe to our newsletter at https://expo.dev/mailing-list/signup for more updates.