For 18 months, I've shipped React Native apps with Expo Updates in production. Across three different projects, two had a blocking production crash that got fixed in under an hour thanks to an OTA patch. Without OTA we'd be looking at 24-48 hours for Apple to re-review the binary.

What works

Runtime versioning is your best friend. Tag each native release with an explicit runtime version, and never push an OTA cross-runtime. That's the first rule, and it's also the one everyone breaks once.

The rollback trap

An OTA can roll back by moving the version pointer to a previous build. But if that OTA already installed an incompatible local storage schema, the app crashes on launch. Always code local storage migrations idempotently, tolerant to a rollback.