shipcheck

Apple's required-manifest SDKs, mapped to npm packages

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

Apple publishes which SDKs need a privacy manifest. Nobody publishes which npm packages pull them in. This page does.

All 86 entries on Apple's third-party SDK requirements list, transcribed 6 September 2026 in a real browser, each mapped to the React Native and Expo packages that bring it into an iOS binary.

The headline numbers:

  • 50 of the 86 have a common React Native or Expo route into an app
  • 18 arrive directly — you installed the package
  • 32 arrive transitively — you installed something else, and this came with it
  • 20 reach iOS only through Flutter
  • hermes, React Native's default JavaScript engine, is on the list — which makes this close to a universal React Native concern rather than a Firebase one

The 32 transitive entries are where ITMS-91061 rejections come from. You installed Firebase; Firebase installed gRPC; gRPC installed nanopb, Abseil, Protobuf and BoringSSL. All four are on Apple's list, and none of them appear anywhere in your package.json.

Download the full mapping as JSON — CC BY 4.0, attribution to shipcheck.bakerventuresstudio.com.

Why this did not already exist

Apple's list is authoritative and framework-agnostic: 86 SDK names, no context. It is a correct answer to a question React Native developers are not asking, because they do not think in pod names. They think in package.json.

The translation layer between the two is the whole difficulty, and it is why an ITMS-91061 email is so frustrating — it can name GTMSessionFetcher, which you have never heard of, installed by GoogleSignIn, which was installed by a login button you added eight months ago.

Everything below is that translation.

How to use it in thirty seconds

# 1. What do you actually ship?
grep -oE '"(@?[a-z0-9@/._-]+)": "' package.json | tr -d '":' | sort

# 2. What already carries a manifest?
find node_modules -name "PrivacyInfo.xcprivacy" | sed 's|node_modules/||' | cut -d/ -f1 | sort -u

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

Step 3 is the important one. Podfile.lock is the ground truth, because it contains what was actually resolved rather than what you asked for. Intersect it with the tables below.

The direct dependencies (18)

These arrive because you installed them. If one of these is in your package.json, the SDK is in your app.

Apple's listed SDKWhat it isInstalled asNote
CapacitorHybrid app framework@capacitor/coreHybrid apps only.
CordovaHybrid app frameworkcordovaHybrid apps only.
FBSDKCoreKitMeta SDK corereact-native-fbsdk-next
FBSDKLoginKitFacebook Loginreact-native-fbsdk-next
FBSDKShareKitFacebook sharingreact-native-fbsdk-next
FirebaseAuthAuthentication@react-native-firebase/auth
FirebaseCoreFirebase core@react-native-firebase/app
FirebaseCrashlyticsCrash reporting@react-native-firebase/crashlytics
FirebaseDynamicLinksDeep links@react-native-firebase/dynamic-links
FirebaseFirestoreDocument database@react-native-firebase/firestore
FirebaseMessagingPush notifications@react-native-firebase/messaging
FirebaseRemoteConfigRemote config@react-native-firebase/remote-config
GoogleSignInGoogle sign-in@react-native-google-signin/google-signin
hermesReact Native's default JavaScript enginereact-nativeIn virtually every React Native app. The single most overlooked entry on Apple's list.
LottieVector animationslottie-react-native
OneSignalPush notificationsreact-native-onesignal
RealmSwiftMobile databaserealm, @realm/react
UnityFrameworkEmbedded Unity@azesmway/react-native-unity

The transitive ones (32) — where the rejections come from

You did not install any of these. They arrived under something else, and they are the usual cause of an ITMS-91061 that names a framework you have never heard of.

Apple's listed SDKWhat it isArrives underNote
AbseilGoogle C++ common libraries@react-native-firebase/firestore, @react-native-firebase/appUnder gRPC, under Firebase.
AppAuthOAuth / OpenID Connect@react-native-google-signin/google-signin, react-native-app-auth
BoringSSL / openssl_grpcTLS@react-native-firebase/firestoreUnder gRPC.
ChartsiOS chartingreact-native-charts-wrapper
DKImagePickerControllerImage pickerreact-native-image-crop-picker
DKPhotoGalleryPhoto galleryreact-native-image-crop-picker
FBAEMKitMeta aggregated event measurementreact-native-fbsdk-next
FBLPromisesPromises support libreact-native-fbsdk-next, @react-native-firebase/app
FBSDKCoreKit_BasicsMeta SDK basicsreact-native-fbsdk-next
FirebaseABTestingA/B testing@react-native-firebase/remote-config
FirebaseCoreDiagnosticsFirebase diagnostics@react-native-firebase/app
FirebaseCoreExtensionFirebase core extension@react-native-firebase/app
FirebaseCoreInternalFirebase core internal@react-native-firebase/app
FirebaseInstallationsInstall identity@react-native-firebase/app
FMDBSQLite wrapperreact-native-sqlite-storage
GoogleDataTransportGoogle telemetry transport@react-native-firebase/app
GoogleToolboxForMacGoogle support lib@react-native-firebase/app, @react-native-google-signin/google-signin
GoogleUtilitiesGoogle support lib@react-native-firebase/app, @react-native-google-signin/google-signin
grpcppgRPC C++@react-native-firebase/firestore
GTMAppAuthGoogle OAuth helper@react-native-google-signin/google-signin
GTMSessionFetcherGoogle HTTP fetcher@react-native-google-signin/google-signin, @react-native-firebase/storage
IQKeyboardManagerKeyboard handlingreact-native-keyboard-manager
IQKeyboardManagerSwiftKeyboard handling (Swift)react-native-keyboard-manager
leveldbKey-value store@react-native-firebase/firestore
nanopbProtocol Buffers (embedded C)@react-native-firebase/app, @react-native-firebase/crashlyticsNobody installs this deliberately. It is the classic surprise entry.
OneSignalCoreOneSignal corereact-native-onesignal
OneSignalExtensionOneSignal notification extensionreact-native-onesignal
OneSignalOutcomesOneSignal outcomesreact-native-onesignal
PromisesPromises support lib@react-native-firebase/app
ProtobufProtocol Buffers@react-native-firebase/firestore
ReachabilityNetwork reachability@react-native-community/netinfoVersion-dependent.
SDWebImageImage loading and cachingreact-native-fast-image

Flutter-only entries (20)

On Apple's list, but they reach an iOS binary through Flutter rather than React Native. Listed for completeness — if you are not embedding Flutter, ignore them.

SDKWhat it is
connectivity_plusFlutter connectivity
device_info_plusFlutter device info
file_pickerFlutter file picker
flutter_inappwebviewFlutter webview
flutter_local_notificationsFlutter notifications
fluttertoastFlutter toasts
geolocator_appleFlutter geolocation
image_picker_iosFlutter image picker
package_infoFlutter package info
package_info_plusFlutter package info
path_providerFlutter paths
path_provider_iosFlutter paths (iOS)
share_plusFlutter share
shared_preferences_iosFlutter preferences
sqfliteFlutter SQLite
url_launcherFlutter URL launcher
url_launcher_iosFlutter URL launcher (iOS)
video_player_avfoundationFlutter video
wakelockFlutter wakelock
webview_flutter_wkwebviewFlutter webview

On Apple's list, no common RN route (16)

These are on Apple's list and can appear in an RN app through a bespoke or less common native module, but there is no widely-used npm package that reliably pulls them in. If one of these turns up in your build, look at your least-common native dependency.

SDKWhat it is
AFNetworkingObjective-C HTTP
AlamofireSwift HTTP
FlutterCross-platform framework
KingfisherImage loading (Swift)
MBProgressHUDProgress indicator
OpenSSLCrypto
OrderedSetSwift collection
RxCocoaReactive UI bindings
RxRelayReactive relays
RxSwiftReactive extensions
SnapKitAuto Layout DSL
StarscreamWebSockets
SVProgressHUDProgress indicator
SwiftyGifGIF rendering
SwiftyJSONJSON parsing
ToastToast messages

The four fixes, in order of preference

1. Update the package. Most maintained libraries added PrivacyInfo.xcprivacy during 2024. Check the changelog for "privacy manifest" and bump.

2. Update the transitive pod, not the wrapper. If nanopb is the problem, bumping @react-native-firebase/app may not move it. Check Podfile.lock for the resolved version and pin the pod explicitly in the Podfile if you have to.

3. Replace the package. For an abandoned library this is the only real answer. A package that will never ship a manifest is now a shipping blocker rather than technical debt.

4. Remove it. Frequently the fastest. A charting library used on one screen, a keyboard manager from 2022, an analytics SDK nobody reads — each removal deletes a whole class of rejection.

What does not work: adding entries for someone else's framework to your app's PrivacyInfo.xcprivacy. Apple's requirement is per-bundle, and states a third-party SDK "can't rely on the privacy manifest files for apps that link the third-party SDK." It will upload and fail identically.

Caveats, stated plainly

Apple's list changes. It is transcribed here on 6 September 2026 and Apple updates it. The date is on this page and in the JSON for that reason.

The npm mapping is compiled by us, not by Apple. Apple publishes the SDK names; the routes into React Native projects are our work, drawn from how these packages resolve in practice. Verify against your own Podfile.lock. It is the only source that knows what your build actually contains.

Package internals change between versions. A library that vendored a listed SDK last year may not now, and vice versa.

Absence from these tables is not safety. Sixteen entries are on Apple's list with no common RN route, and a bespoke native module can pull in any of them.

Reuse it

The JSON is CC BY 4.0. Use it in your own tooling, your own CI check, your own article — attribute it to shipcheck.bakerventuresstudio.com and keep the transcription date attached, because a stale copy of this data is worse than none.

If you find a wrong or missing mapping, that is genuinely useful to know — the whole point of publishing it as data is that it can be corrected.

What shipcheck does with it

shipcheck runs this intersection automatically: it reads package.json, Podfile.lock, node_modules and every PrivacyInfo.xcprivacy in the tree, and reports which listed SDK is missing a manifest — before you build, inside the Claude Code session you already have open, with nothing uploaded anywhere.

ITMS-91061 in detail. · ITMS-91053 in detail. · Every required-reason category and code.

Questions and answers

Which npm packages require an Apple privacy manifest?

Fifty of the 86 SDKs on Apple's list have a common React Native or Expo route into an app. Eighteen arrive directly from a package you installed, and 32 arrive transitively under something else. The full mapping is on this page and downloadable as JSON.

Why does ITMS-91061 name a framework I have never installed?

Because 32 of the SDK entries with an RN route are transitive. You installed Firebase; Firebase installed gRPC; gRPC installed nanopb, Abseil, Protobuf and BoringSSL. All four are on Apple's list and none of them appear in your package.json.

Does react-native itself need a privacy manifest?

hermes, React Native's default JavaScript engine, is on Apple's list. That makes the requirement close to universal for React Native apps regardless of which other libraries they use.

Which Firebase packages pull in listed SDKs?

Effectively all of them. @react-native-firebase/app alone brings FirebaseCore, FirebaseCoreInternal, FirebaseCoreExtension, FirebaseCoreDiagnostics, FirebaseInstallations, GoogleUtilities, GoogleDataTransport, GoogleToolboxForMac, Promises, FBLPromises and nanopb. Adding firestore adds gRPC, Abseil, Protobuf, BoringSSL and leveldb.

Can I download this mapping as data?

Yes. It is published as JSON under CC BY 4.0 with attribution to shipcheck.bakerventuresstudio.com. Apple's list changes, so check the transcription date and verify against Apple's page before relying on it.

Cite this pageshipcheck. “Apple's required-manifest SDKs, mapped to npm packages.” Baker Ventures LLC, September 6, 2026. https://shipcheck.bakerventuresstudio.com/rejections/apple-sdk-to-npm-package-map/