react-native-version-check is a React Native library that fetches the latest published version of your app from the App Store or Google Play and compares it against the version currently installed, so you can prompt users to update. If you need a React Native version check to force or encourage upgrades, this is one of the established options, and it works by parsing the public store listing rather than requiring any backend of your own. This guide covers how to use it, how to do the version comparison correctly, and the security considerations that come with any dependency you add to a mobile app.
There are several packages in this space with confusingly similar names, so it helps to be precise about which one you are pulling in.
What the library does
The core capability is store-listing lookup. Given your app's identifier, react-native-version-check requests the public store page (Google Play or the Apple App Store) and extracts the latest published version string. It also reads the version currently running on the device. With both numbers in hand, you can decide whether an update is available.
Install it from npm:
npm install react-native-version-check
A basic check react native version flow looks like this:
import VersionCheck from 'react-native-version-check';
async function checkForUpdate() {
const latestVersion = await VersionCheck.getLatestVersion();
const currentVersion = VersionCheck.getCurrentVersion();
const update = await VersionCheck.needUpdate();
if (update.isNeeded) {
// update.storeUrl points to the correct store listing
return update.storeUrl;
}
return null;
}
needUpdate() does the comparison for you and returns an object with an isNeeded flag and the store URL to send the user to. It supports Expo as well as bare React Native projects.
Comparing versions correctly
The subtle part of any "is there an update?" feature is semantic version comparison. String comparison breaks immediately: "1.10.0" sorts before "1.9.0" lexically but is a newer release. The library compares by semantic version so 1.10.0 correctly reads as newer than 1.9.0.
You can also gate on the size of the jump. needUpdate() accepts a depth option so you can, for example, only nag users when the major or minor version changed and stay quiet for patch releases:
const update = await VersionCheck.needUpdate({ depth: 2 });
// depth 1 = major only, 2 = major or minor, 3 = any change
This matters for user experience. Prompting on every patch release trains users to dismiss the dialog reflexively, which defeats the point when a security-critical update finally ships.
The forced-update pattern
The most valuable use of a version check is pushing a mandatory update when an old build has a known problem, a broken API contract, or a security fix. The pattern is to compare against a minimum supported version and block the app until the user upgrades:
import { Linking } from 'react-native';
import VersionCheck from 'react-native-version-check';
async function enforceMinimumVersion(minSupported) {
const current = VersionCheck.getCurrentVersion();
if (isOlder(current, minSupported)) {
// show a non-dismissible screen, then:
const url = await VersionCheck.getStoreUrl();
Linking.openURL(url);
}
}
One reliability note: define your minimum supported version on your own server, not hard-coded in the client. If the minimum lives in the build you are trying to deprecate, you cannot change it without shipping yet another build. A tiny remote config endpoint returning the floor version gives you a kill switch for bad releases.
Security and reliability tradeoffs
Any store-scraping library carries a structural risk worth naming. Neither Apple nor Google offers a fully stable public API for "latest version," so libraries in this category parse HTML or semi-documented endpoints. When a store changes its page layout, the lookup can silently start returning stale or empty results. Your code must handle getLatestVersion() returning null gracefully and never hard-block a user because a lookup failed.
There is also the general question of dependency trust. A mobile app's dependency tree is part of its attack surface, and a version-check library sits in a sensitive spot because it makes network requests and can drive users to a URL. Before adding it, check that the package is maintained, look at its open issue count and last release date, and confirm what transitive dependencies it pulls in. This is exactly the kind of review that continuous dependency scanning automates. An SCA tool such as Safeguard can flag a stale or vulnerable transitive dependency in a React Native project, which is easy to miss by eye in a large node_modules. The SCA product page covers how that works, and there is a mobile-oriented walkthrough in our academy.
A note on the crowded namespace
Because so many packages solve this problem, verify you installed the one you intend. react-native-version-check parses store listings and supports Expo. Others like react-native-check-version require react-native-device-info and return an updateType. Some older packages in this space, such as react-native-appstore-version-checker, are marked deprecated by their authors. Pin the exact package name and version in package.json and confirm it against the resolved entry in your lockfile so you are not surprised by a similarly named substitute.
FAQ
How do I check the React Native version of my app at runtime?
Use VersionCheck.getCurrentVersion() from react-native-version-check to read the installed app version, and VersionCheck.getLatestVersion() to read the store's latest. needUpdate() compares them and tells you whether an update is available.
Can react-native-version-check force users to update?
It does not block the app by itself, but it gives you the pieces to build a forced-update flow: detect that the installed version is below your minimum supported version, show a non-dismissible screen, and use the returned store URL to send the user to update. Keep the minimum version in remote config so you can change it without a new release.
Does react-native-version-check work with Expo?
Yes, it supports Expo as well as bare React Native projects. Always confirm compatibility with your specific Expo SDK version in the package documentation before relying on it.
Is it safe to depend on a store-scraping version checker?
It is workable but not risk-free. These libraries rely on parsing store pages rather than a guaranteed stable API, so lookups can break when a store changes its layout. Handle null results gracefully, keep the dependency updated, and scan your dependency tree so a stale or vulnerable version does not slip in unnoticed.