Expo SDK v34.0.0 is out today and is based on React Native 0.59.8, the same React Native version as SDK 33.

SDK 34 is primarily a maintenance release: in lieu of new modules and features, we’ve focused primarily on stability and infrastructure for this release. We expect to continue this trend for at least the next few SDK releases, and we hope that the bugfixes and quality-of-life improvements that you’ll see will continue to enable fast and painless creation of high-quality production apps.

64-bit support and Android App Bundles

SDK 34 includes support for 64-bit-enabled Android builds that also make use of Android App Bundles (AABs). 64-bit support will be required for new updates to apps on the Google Play Store starting August 1st.

We introduced 64-bit support for SDK 33 projects a couple of weeks ago, and support will continue for SDK 33 projects. This means that starting August 1st, in order to submit new app updates to Google Play, your project will need to be built with SDK 33 or 34.

AABs, while not required by Google Play, can make your final user-facing app size significantly smaller. With AABs, Google will serve multiple different APKs optimized for individual devices, meaning each user will download only the code and resources they need. To create an AAB, run expo build:android -t app-bundle on an SDK 33 or 34 project. (No additional flags are needed for 64-bit support.)

iOS 13 compatibility

SDK 34 also includes support for iOS 13. Apps made with React Native 0.59.8 or below crash when launched on the current public beta of iOS 13. This includes apps made with any previous Expo SDK release.

We’ve patched this crash in SDK 34 so your app will be ready for the iOS 13 release. We’ve also backported the patch to our SDK 31, 32 and 33 Turtle builders, so if you’re still on one of these SDK versions, you can run expo build:ios now to get the fix.

If you have a production app, we highly recommend that you release a new build with this fix as soon as possible, even if you don’t immediately upgrade to SDK 34. This will future-proof your app from possible issues when iOS 13 releases to the public in September.

We will continue to actively monitor iOS 13 compatibility in Expo apps and address any issues as they arise.

Required modular imports

In SDK 33, we deprecated imports from the monolith expo package in favor of installing and importing from individual module packages like expo-file-system . With SDK 34, we’ve fully removed the ability to import most modules from the expo package. This means that if you try to import { FileSystem } from 'expo'; , you’ll now see an error instead of a warning.

In SDK 34, you will need to use the expo install command to install modules; this command is a wrapper around npm install / yarn add that automatically installs a module version compatible with your SDK version. For example, for the FileSystem module, you should run expo install expo-file-system and use import * as FileSystem from 'expo-file-system'; .

This change paves the way for tree-shaking and smaller JavaScript bundles. It also makes moving between Expo’s managed and bare workflows simpler. To make the transition smoother, we’re providing expo-codemod , a command line utility that will parse your JS and automatically update any affected imports. Instructions are on the linked README page.

If you still see an error screen after fixing all of the imports in your application code, one or more of your dependencies may still use the old import style. In that case, you’ll need to upgrade those dependencies to versions that support the new import style. If none are available, unfortunately you’ll need to wait to upgrade. (If this is a package we manage, please let us know, or send a PR!)

Snack is tri-platform

In the previous SDK release, we announced the first beta release of Expo web, adding a third platform that all Expo projects can target. Now we’ve added web support to Snack, too!

A Snack project running on web, Android, and iOS

This means you can get the ease and simplicity of starting a project on Snack, and instantly be able to see how it looks on all three platforms, in real time, in the same browser window. Check it out now! (If you don’t see the Web button right away, make sure to pick SDK 33 or 34 in the lower right hand corner.)

Improvements to Expo Web

While Expo’s web support is still in beta, we’ve made a number of improvements for this release. We’ve added experimental web support for react-native-gesture-handler , a universal jest config that works with all three platforms, and increased babel stability and testing to reduce future breakages.

Regarding navigation, while react-navigation works great for many apps on iOS and Android, for web projects we currently recommend that people look at other libraries like react-router that are better suited for web routing and navigation.

Please continue to try out Expo Web and let us know as you run into any issues! We’re continuing to improve the stability of web support, and we hope to bring it out of beta in an upcoming SDK release.

A note on proprietary analytics modules

Back in April, we removed the Branch module from the managed workflow for Android. This was in response to a number of cases where Google removed apps from the Play Store without warning, due to including Branch native code without a sufficient Privacy Policy. While we don’t generally remove modules in production like this, we felt it was justified in this case because of the scope and seriousness of the actions by Google Play.

Recently, we’ve received a number of questions regarding support for the Branch module, and we want to reaffirm that nothing is changing in the foreseeable future. Like other modules that connect to proprietary third-party services, the Branch module is best supported in the bare workflow, and we do not anticipate adding it back to the managed workflow. Aside from being costly for us to maintain, these modules can have side effects like increasing your app size and causing issues like App Review.

While we support a few other widely used analytics modules in the managed workflow, each has been the result of a carefully considered decision. Generally, we aim to provide non-proprietary primitives in Expo, upon which companies like Branch can build Expo modules. If you’d like to read more about the reasoning behind this decision, check out this post.

Using the Expo client and web in the bare workflow

The updated bare workflow template project has built-in support for running your project inside of the Expo client and for Expo for web.

The “Using Expo client in Bare Workflow” guide gives more information on the motivation behind supporting the Expo client in this context, the limitations, and tips to make your bare workflow apps work well in the Expo client (such as the new .expo.[js/json/ts/tsx] extension).

The “Using Expo for web in Bare Workflow” provides brief instructions for how to get started from initializing a new project. If you have an existing bare workflow project that you’d like to use Expo for web with, we recommend initializing a new project and then copying any different configuration over to your project.

If you’re not yet clear on what the bare workflow is, have a look at the Bare Workflow Walkthrough and compare it with Managed Workflow Walkthrough!

Here we are running the same app in client as in a build created in Xcode. In the Xcode build we include a native module that isn’t in the Expo SDK (Mapbox), and in the Expo client version we fallback to an API that is available in the Expo SDK (Google Maps).

Looking ahead

Xcode 11 and iOS 13 targeting

We aim to release our next SDK version, with full iOS 13 and Xcode 11 support, around the time of the public iOS 13 launch in September. This will allow us to iron out any other kinks in supporting these new versions and give developers enough time to upgrade and stay up-to-date with the latest iOS.

Hermes

We know the React Native community is very excited about Hermes, Facebook’s newly open-sourced JavaScript engine, and we share your excitement! We’re starting the process of working towards supporting Hermes in the Expo client now, and we hope to provide full Hermes support in an upcoming SDK version.

Deprecating ExpoKit in favor of the bare workflow

We’re continuing to invest in building tooling and documentation around the bare workflow. We believe that this workflow is strictly better than ExpoKit and has lots of advantages for developers, such as full compatibility with libraries in the React Native ecosystem, easier upgrades, and more modular native code that doesn’t include all of the libraries in the Expo monolith. The bare workflow is the easiest and quickest way to achieve optional modules — that is, including native code for only the Expo modules you actually use.

That said, there are still a few modules and capabilities — notably, OTA updates and push notifications — that are still not supported in the bare workflow and require ExpoKit. We’re actively working towards solutions for both of these and hope to have them ready for an upcoming SDK version, allowing us to fully deprecate ExpoKit in favor of a superior workflow.

Dropping older SDK versions

We routinely drop SDK versions that have low usage in order to reduce the number of versions that we need to support. While we did not drop any SDK versions with this release, we aim to provide roughly six months of backward compatibility with each new release of the Expo client. As React Native and Expo SDK releases have been spaced out further, this corresponds to fewer supported SDK versions. When SDK 35 is released, we’ll drop support for SDK 31 and 32 at that time in order to meet Google Play’s 64-bit requirement, and potentially more due to incompatibilities within the Expo client.

API improvements and additions

ImagePicker : added support for video recording in launchCameraAsync . (Related PR.)

: added support for video recording in . (Related PR.) LocalAuthentication : added fallbackLabel option to iOS to allow customization of the system’s passcode fallback dialog. (Related PR. Thanks changLiuUNSW!)

: added option to iOS to allow customization of the system’s passcode fallback dialog. (Related PR. Thanks changLiuUNSW!) SplashScreen : added native mode on Android to fix various issues with splash screen images. (Related PR.)

Other fixes & improvements

BarCodeScanner : fixed issue where UI thread was blocked when defining custom barCodeTypes on iOS.

: fixed issue where UI thread was blocked when defining custom on iOS. FaceDetector : moved to MLKit library for face detection in order to fix compatibility with react-native-firebase . (Related PR.)

: moved to MLKit library for face detection in order to fix compatibility with . (Related PR.) ImagePicker : fixed issue on Android where picking an image larger than 2000px would automatically resize it. (Related PR.)

: fixed issue on Android where picking an image larger than 2000px would automatically resize it. (Related PR.) SQLite : fixed BOOL interpretation on 32-bit iOS devices. (Related PR.)

Library updates

Updated react-native-gesture-handler from 1.2.1 to 1.3.0

from to Updated react-native-branch from 2.2.5 to 3.0.1

from to Updated react-native-reanimated from 1.0.1 to 1.1.0

from to Updated react-native-svg from 9.4.0 to 9.5.1

from to Updated react-native-webview from 5.8.0 to 5.12.0

from to Updated @react-native-community/netinfo from 2.0.10 to 3.2.1

Breaking Changes

Calendar : the DEFAULT constant has been removed. To use the default calendar, pass null instead. This fixes an occasional issue when the calendar name coincides with a SQLite keyword. (Related PR.)

: the constant has been removed. To use the default calendar, pass instead. This fixes an occasional issue when the calendar name coincides with a SQLite keyword. (Related PR.) LocalAuthentication : the iOS-only string argument to the authenticateAsync method has been replaced by an object with a promptMessage key. (Related PR.)

Upgrading Your App

Here’s how to upgrade your app to Expo SDK 34.0.0 from 33.0.0.

Close your Expo CLI server

In app.json , change sdkVersion to "34.0.0"

, change to In package.json , change these dependencies:

- react-native to "https://github.com/expo/react-native/archive/sdk-34.0.0.tar.gz"

- expo to "^34.0.3"

- react to "16.8.3" — (this exact version)

- react-navigation to "^3.11.1" (if you use it — this is also optional, you don’t have to update it to use the newest SDK. If you choose to, make sure you read the changelog for breaking changes.)

- jest-expo to "^34.0.0" (if you use it)

- sentry-expo to "~1.13.0" (if you use it)

, change these dependencies: - to - to - to — (this exact version) - to (if you use it — this is also optional, you don’t have to update it to use the newest SDK. If you choose to, make sure you read the changelog for breaking changes.) - to (if you use it) - to (if you use it) If you use react-navigation you should also run expo install react-native-gesture-handler react-native-reanimated as these are no longer bundled in the expo JavaScript package.

you should also run as these are no longer bundled in the JavaScript package. Delete your project’s node_modules directory and run npm install again (or use Yarn, we love Yarn)

directory and run again (or use Yarn, we love Yarn) Run expo start -c

Update the Expo app on your phones from the App Store / Google Play. expo-cli will automatically update your apps in simulators.

will automatically update your apps in simulators. Make sure to check the breaking changes section of this post!

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.

and/or when you are ready to do a new build for submission to stores. Update all of your imports to the new modular style, optionally by using expo-codemod.

To add web support, follow the instructions in this blog post.

Updating ExpoKit to SDK 34