Building React Native Apps with Expo: What the Managed Workflow Actually Buys You
TIL that starting a React Native app in Expo's managed workflow paid off immediately for camera/location access, but I still had to understand what 'ejecting' would cost before I needed it.
The Problem #
The Archery Garage app needed camera access, live location tracking via Mapbox, and push-style updates, which in a bare React Native project each mean configuring native modules and platform-specific permissions by hand — real work before you write a single screen.
Context #
This was a solo project with no dedicated mobile-native experience to lean on, and a real deadline for the App Store/Play Store submission.
What I Tried #
Started in Expo's managed workflow specifically to avoid touching native iOS/Android project files directly, using expo-camera and expo-location instead of hand-linking native modules.
What Went Wrong #
Not a failure exactly, but a real constraint I hit later: a Mapbox SDK feature I wanted required a native module Expo's managed workflow didn't support at the time, which meant a decision point — find a managed-compatible alternative, or eject to the bare workflow and take on native build maintenance myself.
The Solution #
Used react-native-maps with a managed-compatible tile provider instead of the specific Mapbox SDK feature, staying in the managed workflow rather than ejecting. The feature gap was real, but not worth trading away Expo's build/update tooling for.
import * as Location from "expo-location";
const { status } = await Location.requestForegroundPermissionsAsync();
if (status === "granted") {
const location = await Location.getCurrentPositionAsync({});
}Why It Works #
Expo's managed workflow trades some native flexibility for not having to own Xcode/Android Studio build configuration, permission entitlements, and native module linking yourself. For a solo developer on a deadline, that trade is usually worth it — the question is knowing in advance which features would force you out of it.
Lessons Learned #
"Should I use Expo managed or bare?" isn't a one-time decision to make from a tutorial's recommendation — it's a trade-off that should be re-evaluated against your actual feature list, because the cost of ejecting later is real and worth avoiding if a managed-compatible alternative exists.
What I Would Do Differently #
I'd check Expo's supported-modules list against my full feature list before starting, instead of discovering a gap mid-build and having to find a workaround under time pressure.
Related Concepts #
Expo managed vs. bare workflow, native module linking, EAS Build.
Related content
Understanding React Native File URIs Before You Try to Upload One
TIL that a file:// URI from Expo's camera isn't a file you can send as-is — it's a path into a cache directory the OS can clear, and the upload code needs to treat it that way.
Designing a Delivery App for Unreliable Networks, Not Just Offline
TIL that 'handle offline' undersold the actual problem — the failure mode that hurt drivers most was a flaky, half-connected state, not a clean offline/online boundary.
Android-Specific React Native Problems That Never Show Up on iOS
TIL that a React Native feature working perfectly in the iOS simulator is not evidence it'll work on Android — cleartext traffic, back-button handling, and permission dialogs all diverge silently.