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.

Light and Dark modes in the iOS Expo client. Switch between them from the profile tab

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

provides information about the physical device/manufacturer as well as the operating system. Application provides information about your application and its environment.

provides information about your application and its environment. Battery provides information about the power state of the device.

provides information about the power state of the device. Network provides information about the device’s current network connection.

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.)

: add support for serving non-personalized ads. (Related PR.) Calendar : add getDefaultCalendarAsync method on iOS. (Related PR.)

: add method on iOS. (Related PR.) MediaLibrary : added createdAfter and createdBefore options to getAssetsAsync to allow requesting assets within a specific timeframe. (Related PR.)

: added and options to to allow requesting assets within a specific timeframe. (Related PR.) Notifications : added iosDisplayInForeground option to allow displaying notifications on iOS when your app is in the foreground. (Related PR.)

: added 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)

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.)

: 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.)

: background mode is no longer erroneously required to use geofencing. (Related PR.) ImagePicker : fixed launchImageLibraryAsync on iOS 13. (Related PR.)

Library updates

Updated react-native-maps from 0.24.0 to 0.25.0

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

from to Updated react-native-screens from 1.0.0-alpha.22 to 1.0.0-alpha.23

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

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

from to 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.)

: when JS encounters a fatal error, 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.)

: all Admob ads now require a new configuration value in app.json, . The value can be found by following the guide in this Google Support answer. (Related PR.) Contacts : removed the note field on iOS as this now requires a separate entitlement in iOS 13. (Related PR.)

: removed the field on iOS as this now requires a separate entitlement in iOS 13. (Related PR.) Facebook : upgraded the underlying iOS library to v5.4.1 . This upgrade removed support for all login behaviors other than browser . The behavior parameter has been removed from the TS type declaration and will no longer have any effect. (Related PR.)

: upgraded the underlying iOS library to . This upgrade removed support for all login behaviors other than . The parameter has been removed from the TS type declaration and will no longer have any effect. (Related PR.) Google : loginAsync now accepts a redirectUrl 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.)

: now accepts a 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 the country constants with region . This is now only available on iOS and Web. (Related PR.)

: replaced the constants with . This is now only available on iOS and Web. (Related PR.) StoreReview : has been moved out of the expo package to its own package. You’ll need to change any instances of import { StoreReview } from 'expo'; to import * as StoreReview from 'expo-store-review'; .

: has been moved out of the package to its own package. You’ll need to change any instances of to . WebView : removed react-native ’s UIWebView implementation. Add useWebkit prop to use WKWebView , or replace with @react-native-community/react-native-webview . (Related PR.)

: removed ’s implementation. Add prop to use , or replace with . (Related PR.) sentry-expo : v~2.0.0 introduces a new API, see the Using Sentry documentation for details. (Related PR.)

: introduces a new API, see the Using Sentry documentation for details. (Related PR.) expo-file-system : The FileSystem.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 of expo-cli , you can update with npm i -g expo-cli ).

in your project directory (requires the latest version of , you can update with ). 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 run expo client:install:ios and expo client:install:android .

will automatically update your apps in simulators if you delete the existing apps, or you can run and . 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 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.