Expo SDK 35 is now available
Expo SDK v35.0.0 is out today and is based on React Native 0.59, the same React Native version as SDKs 33 and 34.
SDK 35 introduces full support for iOS 13 and two of the new user-facing features it introduces: Dark Mode and Apple Authentication. We’ve added a number of other improvements, small modules, and bugfixes as well. Read on for more details!
🌒 Dark Mode
Undoubtedly iOS 13’s most exciting new feature is Dark Mode. We’ve added the react-native-appearance
module so that you can listen to your users’ appearance preferences and update your app’s UI accordingly. Check out the Appearance
module docs for more information.
It will be up to you to implement a dark style for your app. Since everyone’s UI tends to look very different we are not providing any UI primitives that automatically respond to Dark Mode. If you’re using React Navigation, you can enable a built-in dark theme for your navigation components; see the Themes documentation for more info.

🔑 Apple Authentication
Another new feature introduced with iOS 13 is Apple Authentication, or “Sign in with Apple.” If your app uses any third-party login service such as Google or Facebook login, Apple will now require that you also offer Apple Authentication as an option in order for your iOS app to be approved during App Store Review. Further, you must use Apple’s proprietary button in your app’s UI.
We’ve added a new AppleAuthentication
module, which provides login functionality as well as the AppleAuthenticationButton
UI component. If you use third-party logins, you’ll need to update your app to include this module before submitting an iOS 13 update to the App Store. Check out the AppleAuthentication
module docs for more information.
🌏 Improvements to Expo Web
SDK 35 comes with a bunch of awesome improvements to Expo Web. First, we’re rolling out support for server-side rendering; all Expo packages now support SSR. To make deploying your site even more painless, we’re also adding easy integration with Next.js and the ZEIT Now service! Documentation around this integration, as well as information about limitations, is available here.
📱 New modules for Device and Environment Info
We’ve added a number of small modules for requesting information about various aspects of the device and environment in which your app is running. These modules mostly provide constant fields, as well as some getter methods and events, that are accessible to all native apps on each platform.
Device
provides information about the physical device/manufacturer as well as the operating system.Application
provides information about your application and its environment.Battery
provides information about the power state of the device.Network
provides information about the device’s current network connection.Cellular
provides information about the device’s current cellular network and telephony state.
Check out the API docs for more information on each of these modules.
🧹 Dropping SDKs 31 and 32 from the Expo client
We routinely drop SDK versions that have low usage, but we’ve dropped more versions than usual with this release. SDK 33 was the first version that included 64-bit support, and in order for us to update the Expo client on Google Play, every SDK version we include must have 64-bit support.
This release sees the end of life for SDKs 31 and 32. As usual, your standalone apps built with these SDK versions will continue to work; however, SDK 31 and 32 projects will no longer work within the latest version of Expo Client.
At this time, you can still run expo build
for SDK 31 and 32 projects. Note, however, that you must upgrade to 33 or later in order to submit an updated APK to Google Play due to the 64-bit requirement. We will remove support for SDKs 31 and 32 in expo build
in a future release.
If you still need to test a project running SDK 31 or 32, you can download this Android client version and this iOS client version.
🌲 Android Branch support
For those unaware, we previously supported the Branch
module in the managed workflow, but back in April we chose to remove it on Android. Good news — managed projects built with SDK 34 and above now have optional Branch
support that can be configured at build-time!
To add the Branch
module to your standalone build, run expo install expo-branch
, add your Branch API Key to your app.json
under android.config.branch.apiKey
, and then ensure expo-branch
is a listed dependency in your package.json
at the time of running expo build:android.
If all of these steps have been done correctly, the builder will bundle the Branch
module into your APK file.
We believe that developers should be aware of the inherent risk when including a module that relies on another service. For more details, please read this blog post.
API improvements and additions
Inline requires
We’ve added a lazyImports
option to babel-preset-expo
which allows lazy initialization and inline requires of packages. Check out the documentation on the babel-preset-expo
README.
Admob
: add support for serving non-personalized ads. (Related PR.)Calendar
: addgetDefaultCalendarAsync
method on iOS. (Related PR.)MediaLibrary
: addedcreatedAfter
andcreatedBefore
options togetAssetsAsync
to allow requesting assets within a specific timeframe. (Related PR.)Notifications
: addediosDisplayInForeground
option to allow displaying notifications on iOS when your app is in the foreground. (Related PR.)- Added
react-native-shared-element
to Expo client and standalone/ExpoKit apps (Docs, PR) - Added
react-native-safe-area-context
to Expo client and standalone/ExpoKit apps (Docs, PR)
Other fixes and improvements
For a full list of improvements and bugfixes in this release, refer to the CHANGELOG. A few other highlights:
BackgroundFetch
: fixed occasional exceptions regarding mutating an array while being enumerated. (Related PR.)Location
: background mode is no longer erroneously required to use geofencing. (Related PR.)ImagePicker
: fixedlaunchImageLibraryAsync
on iOS 13. (Related PR.)
Library updates
- Updated
react-native-maps
from0.24.0
to0.25.0
- Updated
react-native-reanimated
from1.1.0
to1.2.0
- Updated
react-native-screens
from1.0.0-alpha.22
to1.0.0-alpha.23
- Updated
react-native-svg
from9.5.1
to9.9.2
- Updated
react-native-webview
from5.12.0
to7.0.5
- You don’t have to make these changes manually, these will be updated automatically when you run
expo upgrade
.
Breaking Changes
- All standalone apps: when JS encounters a fatal error, the app will now crash immediately instead of showing the generic Expo error screen UI. (Related issue.)
Admob
: all Admob ads now require a new configuration value in app.json,expo.[platform].config.googleMobileAdsAppId
. The value can be found by following the guide in this Google Support answer. (Related PR.)Contacts
: removed thenote
field on iOS as this now requires a separate entitlement in iOS 13. (Related PR.)Facebook
: upgraded the underlying iOS library tov5.4.1
. This upgrade removed support for all login behaviors other thanbrowser
. Thebehavior
parameter has been removed from the TS type declaration and will no longer have any effect. (Related PR.)Google
:loginAsync
now accepts aredirectUrl
value for apps running in the Expo Client. Previously, it would ignore this, so if you are passing a value, make sure to follow the guidelines. (Related PR.)Localization
: replaced thecountry
constants withregion
. This is now only available on iOS and Web. (Related PR.)StoreReview
: has been moved out of theexpo
package to its own package. You’ll need to change any instances ofimport { StoreReview } from 'expo';
toimport * as StoreReview from 'expo-store-review';
.WebView
: removedreact-native
’sUIWebView
implementation. AdduseWebkit
prop to useWKWebView
, or replace with@react-native-community/react-native-webview
. (Related PR.)sentry-expo
:v~2.0.0
introduces a new API, see the Using Sentry documentation for details. (Related PR.)expo-file-system
: TheFileSystem.documentDirectory
was changed. If upgrading from SDK 32 or below, you must upgrade your app to SDK 33 or 34 first, before upgrading to SDK 35 in order to migrate app files. (Related PR.)
Upgrading Your App
Here’s how to upgrade your app to Expo SDK 35.0.0 from 34.0.0.
- Close your Expo CLI server
- Run
expo upgrade
in your project directory (requires the latest version ofexpo-cli
, you can update withnpm i -g expo-cli
). - Make sure to check the breaking changes section of this post!
- 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 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 35
- Follow the instructions given in the docs.
- For Android, remove the following lines from your
app/build.gradle
file:
annotationProcessor 'com.raizlabs.android:DBFlow-Compiler:2.2.1'
implementation "com.raizlabs.android:DBFlow-Core:2.2.1"
implementation "com.raizlabs.android:DBFlow:2.2.1"
We’ve since added the step above to the docs but in case you upgraded before then, we wanted to post here for posterity.