Why not Expo?
Expo isn’t ready to be used for all apps yet. There are plenty of cases where its current constraints may not be appropriate for your project. The intention of this document is to outline some of those cases, so that you don’t end up building an app with Expo and getting frustrated when you encounter an obstacle that you can’t overcome without detaching to ExpoKit or ejecting to using React Native without Expo at all. We are either planning on or actively working on building solutions to all of the features listed below, and if you think anything is missing, please bring it to our attention by posting to our feature requests board.
Non-image assets are not bundled inside of standalone apps. Sometimes you need a specific asset like a font or a video to be available immediately when the user opens the app. This is supported for images, but for other assets, they will automatically load from our CDN the first time your app starts. This can be a dealbreaker for some projects. In these situations, the only option available to you right now is caching assets when your app loads. We are working on making it possible to bundle all assets with your standalone app.
Expo apps don’t support background code execution (running code when the app is not foregrounded or the device is sleeping). This means you cannot use background geolocation, play audio in the background, handle push notifications in the background, and more. This is a work in progress.
If you need to keep your app size extremely lean, Expo may not be the best choice. The size for an Expo app on iOS is approximately 25mb, and Android is about 20mb. This is because Expo includes a bunch of APIs regardless of whether or not you are using them — this lets you push over the air updates to use new APIs, but comes at the cost of binary size. We will make this customizable in the future, so you can trim down the size of your binaries.
If you know that you want to use a particular push notification service (such as OneSignal) instead of Expo’s Push Notification service/API, you will need to use ExpoKit or React Native without Expo.