shipcheck

The React Native privacy-manifest census

Updated September 6, 2026 · published by Baker Ventures LLC · sources cited inline

Of the 201 most popular React Native npm packages that ship native iOS code, 22 include a privacy manifest of their own. That is 10.9 percent.

Measured on 6 September 2026 by taking the most popular React Native packages from the npm registry, resolving each to its latest published version, reading its file tree, and looking for PrivacyInfo.xcprivacy. 399 packages resolved; 201 of them ship native iOS code and are therefore the only ones that could need a manifest at all.

The caveat matters as much as the number. A manifest is required where a bundle uses a required-reason API or appears on Apple's third-party SDK list. A package with native code that touches neither does not need one, so absence here is a prompt to check, not a verdict. This also measures presence rather than correctness: it does not verify that declared categories and reason codes are right.

What the number does establish is the shape of the problem. If you install ten native React Native packages, roughly nine are not carrying a manifest of their own, and Apple's rule is per-bundle: your app's manifest does not cover them.

The numbers

Packages resolved399
Unresolved (unpublished, renamed, or no file tree)1
Shipping native iOS code201
Of those, shipping a privacy manifest22
Coverage10.9 percent

Download the full dataset as JSON. CC BY 4.0.

The 22 that ship one

PackageVersion
react-native0.87.1
expo-constants57.0.17
expo-file-system57.0.6
@react-native-async-storage/async-storage3.1.1
expo-application57.0.2
expo-notifications57.0.17
expo-system-ui57.0.3
expo-device57.0.1
expo-localization57.0.1
react-native-device-info15.0.2
lottie-react-native7.5.0
react-native-maps1.29.0
react-native-view-shot5.1.1
react-native-blob-util0.24.10
expo-media-library57.0.4
react-native-permissions5.6.1
expo-task-manager57.0.16
react-native-image-picker8.2.1
@segment/analytics-react-native2.24.0
react-native-image-crop-picker0.51.1
@react-native-camera-roll/camera-roll7.10.2
react-native-plaid-link-sdk13.1.0

The pattern is legible: they cluster on packages touching an obvious permission surface, such as notifications, media library, camera roll, device info, permissions and the file system. Those are the teams for whom the requirement was unmissable.

react-native itself ships one, which matters more than any other row here. hermes, React Native's default JavaScript engine, is on Apple's third-party SDK list, so this requirement touches essentially every React Native app rather than only those using Firebase or Facebook.

Ranked by npm's own popularity score. 179 packages with native iOS code ship no manifest of their own.

PackageVersion
@expo/config-plugins57.0.9
expo-font57.0.3
react-native-safe-area-context5.9.1
expo-modules-core57.0.16
expo-asset57.0.16
expo-keep-awake57.0.1
@expo/package-manager1.13.1
react-native-reanimated4.6.0
react-native-worklets0.12.1
react-native-svg15.15.5
expo-linking57.0.9
expo-router57.0.19
expo-secure-store57.0.3
expo-web-browser57.0.2
expo-manifests57.0.1
expo-updates-interface57.0.1
expo-splash-screen57.0.8
@expo/dom-webview57.0.1
expo-symbols57.0.2
expo-haptics57.0.2
expo-image-picker57.0.16
expo-dev-menu-interface57.0.0
expo-json-utils57.0.1
expo-image57.0.4
expo-dev-menu57.0.18
expo-dev-client57.0.18
expo-glass-effect57.0.1
expo-updates57.0.21
expo-crypto57.0.2
expo-linear-gradient57.0.1

Read this list carefully rather than alarmingly. Several of these plausibly use no required-reason API at all, and a package can also be covered by a manifest inside a pod it depends on rather than in its own published tree. The list tells you where to look. It does not tell you what you will find.

Why the per-bundle rule makes this your problem

Apple's wording is that for each executable or dynamic library in an app that uses a required reason API, the bundle that includes it needs to include a privacy manifest file. And a third-party SDK "can't rely on the privacy manifest files for apps that link the third-party SDK."

Both halves matter. You cannot declare on a dependency's behalf, and the dependency cannot lean on you. So when a dependency that needs a manifest does not ship one, the options are upstream: update it, fork it, replace it, or remove it. That is why an ITMS-91061 email names a framework you have never installed. ITMS-91061 in detail.

What to do with this

# what your own tree already carries
find node_modules -name "PrivacyInfo.xcprivacy" | sed 's|node_modules/||' | cut -d/ -f1 | sort -u

# what actually resolved into the iOS build, transitives included
grep -E '^ +- ' ios/Podfile.lock | sed 's/[ -]*//' | cut -d' ' -f1 | sort -u

Podfile.lock is the ground truth, because it holds what was resolved rather than what you asked for. Intersect it with Apple's 86-SDK list mapped to npm packages, and this census tells you which of the rest have done the work.

Method, and its limits

Population. The most-depended-upon React Native packages per the npm registry search API's popularity ranking. Not a random sample, and deliberately so: these are the packages a developer is most likely to install.

Denominator. Only packages shipping native iOS code, detected by a .podspec, an ios/ directory, or Swift and Objective-C sources. A JS-only package cannot use a required-reason API from a bundle of its own, and counting it as missing a manifest would inflate the problem. An earlier run of this script matched .m as a substring, which also matched readme.md, and reported 20 of 20 packages as native including one with three files. The denominator is the number most easily got wrong, and getting it wrong flatters the headline.

Detection. A file named PrivacyInfo.xcprivacy anywhere in the published tarball, via the jsDelivr file-tree API. Presence, not correctness.

Reproduce it. scripts/rn_privacy_census.py in the source repository. The dataset carries its measurement date; re-run it and the number will move.

This measures published packages, not your project. shipcheck runs the same intersection against your actual node_modules and Podfile.lock locally, before you build, and reports which specific bundle is missing which declaration. What it checks.

Questions and answers

How many React Native packages have a privacy manifest?

Of the 201 most popular React Native npm packages that ship native iOS code, 22 include a PrivacyInfo.xcprivacy file in their published package, which is 10.9 percent. The remaining 179 do not ship one of their own.

Does a missing privacy manifest mean a package is broken?

No, and this is the most important caveat. A manifest is only required where a bundle actually uses a required-reason API or appears on Apple's third-party SDK list. A package with native code that touches neither does not need one. Absence is a prompt to check, not a verdict.

Which React Native packages do ship a privacy manifest?

22 of the ones we checked, and they skew heavily toward packages touching obvious permission surfaces such as notifications, media library, camera roll, device info and permissions. react-native itself ships one, which matters because hermes is on Apple's required-SDK list.

How was this measured?

The most popular React Native packages from the npm registry search API, each package's latest published version, its file tree from the jsDelivr data API, and a filename match on PrivacyInfo.xcprivacy. Presence only, so it does not check that declared categories or reason codes are correct.

Why does this matter for App Store submission?

Because Apple's requirement is per-bundle. Your app's manifest does not cover your dependencies, so if a dependency uses a required-reason API and ships no manifest of its own, the fix is upstream rather than in your project. That is why ITMS-91061 emails name frameworks developers have never heard of.

Cite this pageshipcheck. “The React Native privacy-manifest census.” Baker Ventures LLC, September 6, 2026. https://shipcheck.bakerventuresstudio.com/rejections/react-native-privacy-manifest-census/