Upwell

Store flows and install sources

How Upwell picks between Play flexible, Play immediate, the App Store sheet and a plain store link.

Every store decision (store.recommended, store.required) carries a flow. startUpdate() runs it.

FlowPlatformWhat the user sees
playFlexibleAndroidPlay's dialog, then a background download (store.downloading), then "Restart to update" (store.readyToInstall)
playImmediateAndroidPlay's full-screen update UI. The app restarts when it's done
appStoreSheetiOSThe App Store product page, in-app (SKStoreProductViewController)
storeLinkBothThe store app or web page, opened through Linking

Install source

The native module detects where the binary came from:

installSourceAndroidiOS
playInstaller is the Play Store
appStoreApp Store build (no embedded provisioning profile, production receipt)
testFlightTestFlight build (sandbox receipt)
sideloadAnother installer, or noneDevelopment, ad hoc or enterprise signed
unknownDebuggable buildSimulator

How the flow is chosen

Android

Two safety checks are worth knowing:

  • Play must actually offer the build. If you raise minimum before the build is live in Play (or before Play has rolled it out to this device), a required update falls back to the store link instead of starting a Play flow that can't satisfy the minimum.
  • Play is never asked about installs it didn't make. Sideloaded and dev builds skip the Play API entirely.

If a Play flow fails or throws, Upwell falls back to the store link.

iOS

  • appStoreSheet when the install is from the App Store and an App Store id is known (ios.appStoreId in the policy, or the trackId from the lookup).
  • storeLink otherwise: TestFlight, development builds, or no App Store id.

If the sheet fails to load (offline, region restrictions), Upwell opens the App Store app instead.

iOS has no equivalent of Play's in-app download. The App Store sheet lets users update without leaving your app, but the update itself is installed by the system, and the app is relaunched on the new build.

Store URLs

PlatformDefault
Androidhttps://play.google.com/store/apps/details?id=<package>, opened as market://details?id=<package> when the Play Store app is available
iOShttps://apps.apple.com/app/id<appStoreId>, or the lookup's trackViewUrl

Override it per platform with storeUrl in the policy, for example to send Android users to another store.

Flow results

startUpdate() and startStoreUpdate() resolve to one of:

ResultMeaning
acceptedThe user accepted Play's dialog
canceledThe user declined Play's dialog. For a recommendation, this counts as "Later" and snoozes it
failedThe flow couldn't run (the store link fallback may have been tried)
notStartedPlay didn't start the flow
dismissedThe user closed the App Store sheet
openedA store link was opened

opened and dismissed don't mean the user actually updated. Upwell checks again when the app comes back to the foreground.

On this page