Expo SDK 45
Today we’re announcing the release of Expo SDK 45. SDK 45 includes React Native 0.68.2. Thank you to everyone who helped with beta testing.
Highlights
- Updated UI for Expo Go. The new Expo Go UI includes a more modern design language, streamlined access to your organization’s projects, and deeper EAS Update integration with the ability to open specific updates from a branch.
- Revamped Clipboard and WebBrowser modules in rewrite to the new Sweet API.
- Moved expo-crypto, expo-random, expo-haptics and expo-localization to JSI. We also added support for sampling audio frames to expo-av, powered by JSI. Here’s a great example of what you can do with it, via @barthap10 (who also built most of this feature).
- Easier control over excluding permissions included by Android libraries. You can now easily add blocked permissions for Android using
android.blockedPermissions
in your app.json or app.config.js. This will use thetools:node="remove"
XML attribute on a permission node to remove permissions in a merged manifest. - More runtime version validation. Runtime versions may not be decimal numbers ending in “0”, like “1.10”. This ensures that Android’s weakly typed configuration files won’t silently truncate the trailing “0” if it interprets your app’s runtime version as a floating-point number.
- Bumped Android
compileSdkVersion
to 31 and Java 11. - React Native 0.68. This React Native release is the first with support for the New Architecture, but like nearly all libraries in the ecosystem, we don’t yet support it for Expo modules with view managers. We plan to roll out support this summer. At Expo we are very excited for what the New Architecture can do to raise the ceiling for what is possible with React Native.
- Deprecated many third-party service wrapper libraries in favor of official alternatives with config plugins. The following libraries are now deprecated: expo-ads-admob, expo-analytics-amplitude, expo-ads-facebook, expo-facebook, expo-google-sign-in, expo-segment. Please refer to the respective documentation pages for suggestions on how to migrate to the recommended alternative libraries. The reason that these libraries are deprecated is that there is no longer any utility in maintaining the Expo versions of these packages, given that the existing libraries maintained by the vendors themselves or the canonical community versions will work perfectly in apps built with EAS Build.
💡 Arriving shortly after the release
- ̶S̶n̶a̶c̶k̶ ̶s̶u̶p̶p̶o̶r̶t̶ ̶f̶o̶r̶ ̶S̶D̶K̶ ̶4̶5̶ ̶w̶i̶l̶l̶ ̶b̶e̶ ̶a̶v̶a̶i̶l̶a̶b̶l̶e̶ ̶s̶o̶o̶n̶. Update May 19, 2022: Support for SDK 45 is now available on Snack. It is not yet set as the default version due to an outstanding issue when using react-native-gesture-handler and react-native-reanimated together on Snack.
- ̶S̶u̶p̶p̶o̶r̶t̶ ̶f̶o̶r̶ ̶S̶D̶K̶ ̶4̶5̶ ̶o̶n̶ ̶t̶h̶e̶ ̶c̶l̶a̶s̶s̶i̶c̶ ̶b̶u̶i̶l̶d̶ ̶s̶e̶r̶v̶i̶c̶e̶ ̶(̶
e̶x̶p̶o̶ ̶b̶u̶i̶l̶d̶:̶[̶i̶o̶s̶|̶a̶n̶d̶r̶o̶i̶d̶]̶ ̶
a̶n̶d̶̶t̶u̶r̶t̶l̶e̶-̶c̶l̶i̶
)̶ ̶w̶i̶l̶l̶ ̶b̶e̶ ̶r̶e̶a̶d̶y̶ ̶w̶i̶t̶h̶i̶n̶ ̶a̶ ̶w̶e̶e̶k̶ ̶o̶r̶ ̶t̶w̶o̶ ̶o̶f̶ ̶t̶h̶i̶s̶ ̶r̶e̶l̶e̶a̶s̶e̶.̶ ̶I̶n̶ ̶c̶a̶s̶e̶ ̶y̶o̶u̶ ̶m̶i̶s̶s̶e̶d̶ ̶i̶t̶,̶ ̶S̶D̶K̶ ̶4̶6̶ ̶w̶i̶l̶l̶ ̶b̶e̶ ̶t̶h̶e̶ ̶f̶i̶n̶a̶l̶ ̶r̶e̶l̶e̶a̶s̶e̶ ̶t̶o̶ ̶s̶u̶p̶p̶o̶r̶t̶ ̶t̶h̶e̶ ̶c̶l̶a̶s̶s̶i̶c̶ ̶b̶u̶i̶l̶d̶ ̶s̶e̶r̶v̶i̶c̶e̶. Update May 24, 2022: Support for classic builds for SDK 45 is now live.
⌨️ Expo CLI
SDK 45 includes a beta release of a new, “versioned” local Expo CLI. This revamped CLI is smaller, faster, and aims to bring more longevity, stability, and reliability to your projects by moving the related CLI tooling into the project’s dependencies and improving the underlying implementation details based on the years of experience we have accumulated working on Expo CLI. Learn all about this change and how to test it out in “New: Versioned Expo CLI”. The global Expo CLI will remain the default for this SDK release, but we plan to switch over to the local versioned Expo CLI in an upcoming SDK release.
👩💻 Development Builds
You can now view and test EAS Updates directly from development build with the new Extensions tab. Upgrade expo-dev-client to 0.9.3 and make a new development build to test the latest enhancements.
Quality of life improvements:
- You no longer need to remember to pass
--dev-client
toexpo start
to develop with a development build. - Development servers can be selected from builds without signing in after you have connected to the the first time. (Make sure to upgrade to a recent version of expo-cli to take advantage of this functionality.)
- A race condition would cause prior versions of expo-dev-client to crash the first time they were used on an iOS device has been resolved.
📲 EAS Update
EAS Update is the next generation of Expo’s update service. It is faster, easier to use, and more flexible. Starting today, it’s available to accounts with our legacy Priority subscription. To migrate from our Classic Updates service to EAS Update, follow our guide. To get the most out of EAS Update and all of its features, check out our docs.
Later this year, we’ll release EAS Update to all accounts, allow secure end-to-end code signing, and much more. Stay tuned!
👷♀️ EAS Build and Submit
- Added Xcode 13.3 with the
macos-monterey-12.3-xcode-13.3
image. This is the default image used for SDK 45 and React Native 0.68 projects. - You can now see your progress in the build queue along with an estimate for how long you’ll have to wait directly in EAS CLI and on your build job page. If you want to have priority access to build workers and skip the regular queue, you can sign up for a Production or Enterprise plan.
- In order to better support automatic setup of libraries that add new app extension targets and target-specific entitlements, we’ve added experimental support for an experimental new field in your app.json / app.config.js:
extra.eas.build.experimental.ios.appExtensions
. This is already used by onesignal-expo-plugin (added in this PR) to drastically simplify the process of getting OneSignal configured in your app. The plugin can create the app extension target for you and EAS Build can manage the credentials side automatically. - The new expo-build-properties config plugin enables you to more easily customize common native project properties, such as the
compileSdkVersion
on Android anddeploymentTarget
on iOS.
🌍 Website and documentation
- You can now transfer projects between Expo accounts. You can find the button to initiate the transfer process under your project settings. This has been a common request from agencies and from developers who started an app on an individual account and later want to transfer it to their company account.
- We’ve added a new documentation home page and dark mode support for the website.
🏗 Deprecations, renamings, and removals
- expo-ads-admob, expo-analytics-amplitude, expo-ads-facebook, expo-facebook, expo-google-sign-in, expo-segment are deprecated in favor of first-party and third-party community alternatives. Please refer to their respective documentation for more information.
- expo-app-loading is deprecated — use expo-splash-screen directly instead:
SplashScreen.preventAutoHideAsync()
andSplashScreen.hideAsync()
. The implementation is only a thin wrapper around expo-splash-screen that you can copy into your project if you’d like to keep using it. - react-native-appearance has been deprecated since SDK 43, and it has now been removed from Expo Go. We recommend migrating to React Native’s Appearance API.
- Node 12 support has been dropped.
- Classic builds for iOS on SDK 42 and below will no longer be accepted by the Apple App Store (see a related announcement). Please update to SDK 43 or greater.
- If you use
npx expo
inside of your project (for example, on CI to skip installing Expo CLI globally), we recommend changing it tonpx expo-cli
to prevent accidentally invoking the new, beta, local CLI.
🧹 Dropped SDK 41 and 42; will drop SDK 43 next release
We routinely drop SDK versions that have low usage in order to reduce the number of versions we need to support. This release sees the end of life for SDK 41 and 42. As usual, your standalone apps built with SDK 41 and 42 will continue to work; however, SDK 41 and 42 projects will no longer work within the latest version of Expo Go. They will continue to work with EAS Build and expo-dev-client
.
Our next release will drop support for SDK 43. If your project is running on this release, consider upgrading to a newer version soon.
🍎 iOS 12 support will be dropped in SDK 47
SDK 47 will be released in the fall with support for iOS 16. We will drop support for iOS 12 in the Expo SDK when we add support for iOS 16.
🕰 Eight months left to migrate from Classic Builds (expo build:android
, expo build:ios)
Last November we announced that 2022 is the final year the Classic Build service will be available. If you use expo build:android
or expo build:ios
, you will need to use eas build
or build on your own hardware by the end of this year.
SDK 46 will be the last SDK version supported by Classic Builds. You’ll be able to use expo build
to build apps that use SDK 46 and earlier, but not apps that use SDK 47 and beyond. SDK 47 will also be the first release that targets iOS 16 this fall and depending on App Store requirements, may be required for new iOS app submissions, so be sure to plan ahead.
➡️ Upgrading your app
Managed workflow
Here’s how to upgrade your app to Expo SDK 45 from 44:
- Update to the latest version of Expo CLI:
npm i -g expo-cli
.expo-cli@5.4.3
or greater is required. - Update to the latest version of EAS CLI if you use it:
npm i -g eas-cli
. - Run
expo upgrade
in your project directory. - Refer to the “Deprecations, renamings, and removals” section above for breaking changes that are most likely to impact your app.
- Make sure to check the changelog for all other breaking changes!
- If you use Expo Go: Update the Expo Go 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
andexpo client:install:android
. You can also download the iOS simulator build or the APK from expo.dev/tools. - If you use expo-dev-client: Create a new build of your development app after upgrading. Look in your
App.js
orApp.tsx
and make sure you import ‘expo-dev-client’ for the best debugging experience. - You may need to update custom config plugins in your project. If you run into errors during the
prebuild
phase, investigate your config plugins. You are likely to encounter this if any config plugins depend on a version of@expo/config-plugins
which is lower than4.1
. In some cases this may require following up with a third party library. - If you built a standalone app previously, remember that you’ll need to create a new build in order to update the SDK version. Run
eas build -p ios
and/oreas build -p android
when you are ready to do a new build for submission to stores. - Questions? We’ll be hosting some office hours focused on upgrading to SDK45. Keep an eye out on Discord for more info / sign-ups.
Bare workflow
The bare workflow lets you operate independently of the Expo SDK cycle, updating React Native versions and versions of individual Expo packages whenever you want. However, if you do stick roughly to Expo SDK versions, these steps will help you to upgrade to Expo SDK 45 from 44:
- Update to Xcode 13.3 if you support iOS.
- Update to the latest version of Expo CLI:
npm i -g expo-cli
.expo-cli@5.4.3
or greater is required. - Update to the latest version of EAS CLI if you use it:
npm i -g eas-cli
. - Run
expo upgrade
in your project directory. - Apply any relevant changes from the React Native Upgrade Helper.
- Update your
AppDelegate.mm
(you should have moved from.m
to.mm
in the previous step) update your Expo module configuration as done in this diff. - Refer to the “Deprecations, renamings, and removals” section above for breaking changes that are most likely to impact your app.
- Make sure to check the changelog for other breaking changes!
- Rebuild your native projects with
npm run ios
andnpm run android
and/oreas build
if you use it (it works great with both bare and managed apps!)
Thanks to everyone who contributed to the release!
The team: Tomasz Sapeta, Kudo Chien, Evan Bacon, Kim Brandwijk, Bartłomiej Bukowski, Quinlan Jung, Bartosz Kaszubowski, Bartłomiej (Brick) Klocek, Łukasz Kosmaty, Wojciech Kozyra, Cedric van Putten, Eric Samelson, Jon Samp, Dominik Sokal, Will Schurman, Andrew Smith, and Juwan Wheatley.
External contributors: Giau. Tran Minh, Daniel Merrill, Urata Daiki, Darkce, rissois, Frank Calise, Florian Guitton, Luke Brandon Farrell, Simen Bekkhus, Luiz Gustavo Schiller, Michael Nightingale, Hirbod, Imran Shitta-Bey, Wenhao Ding, David Axelrod, Johan Poirier, HBiede, Allan Chain, Kamil Owczarz, Dillon Hafer, Vincent Polidoro, Numan, Morgan VandenBerg, Noitidart, Rakesh Arunachalam, Charlie Cruzan, and Paul Sore.
Beta testers: Charles de Dreuille, Fernando Rojo, Axel Delafosse, Michael Wood, Timothy Shamilov, Chee Kit, Aniol Pagès, imagio,
Amr Gad, and many of the same folks listed above.
Thank you for reading —we hope you enjoy this release!