shipcheck

ITMS-91061 — Missing privacy manifest

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

ITMS-91061 means a framework on Apple's required-SDK list is in your app without a privacy manifest. The message is short and unhelpful — some variant of "Your app includes frameworks that are missing privacy manifest requirements" — and it usually does not tell you which one.

The important difference from ITMS-91053: 91053 is about a reason you failed to declare, and you fix it in a manifest. 91061 is about a dependency that has no manifest at all, and you generally cannot fix it in your own project. Apple requires the manifest to live in the bundle that contains the library, and states that a third-party SDK "can't rely on the privacy manifest files for apps that link the third-party SDK."

So the fix is almost always update, fork, replace, or remove — and knowing which dependency, before you burn another build cycle, is the whole problem.

Apple's list is the ground truth

Apple publishes a list of "commonly used SDKs in apps on the App Store" that must include a privacy manifest and a signature. As transcribed on 6 September 2026 it contains 86 entries, and the rule is broad: "Any version of a listed SDK, as well as any SDKs that repackage those on the list, are included in the requirement."

The React Native and Expo entries most likely to be in your tree:

Listed SDKHow it gets into an RN/Expo project
hermesReact Native's default JavaScript engine. In almost every RN app.
FirebaseCore, FirebaseAuth, FirebaseCrashlytics, FirebaseMessaging, FirebaseFirestore, FirebaseRemoteConfig, FirebaseABTesting, FirebaseInstallations, FirebaseDynamicLinks, FirebaseCoreInternal, FirebaseCoreExtension, FirebaseCoreDiagnostics@react-native-firebase/*
FBSDKCoreKit, FBSDKLoginKit, FBSDKShareKit, FBSDKCoreKit_Basics, FBAEMKit, FBLPromisesreact-native-fbsdk-next
GoogleSignIn, GTMAppAuth, GTMSessionFetcher, GoogleUtilities, GoogleDataTransport, GoogleToolboxForMac, AppAuth@react-native-google-signin/google-signin, and transitively under Firebase
OneSignal, OneSignalCore, OneSignalExtension, OneSignalOutcomesreact-native-onesignal
Lottielottie-react-native
RealmSwiftrealm
SDWebImage, Kingfisher, SwiftyGifimage loading, often transitive
RxSwift, RxCocoa, RxRelaytransitive under various native modules
Alamofire, AFNetworking, Starscream, ReachabilityHTTP and networking, often transitive
IQKeyboardManager, IQKeyboardManagerSwiftkeyboard handling wrappers
SnapKit, SwiftyJSON, Toast, MBProgressHUD, SVProgressHUD, OrderedSetassorted iOS libraries pulled in transitively
Protobuf, nanopb, grpcpp, Abseil, OpenSSL, BoringSSL / openssl_grpc, leveldb, Promisestransitive under Firebase and gRPC
FMDB, sqfliteSQLite wrappers
Chartscharting wrappers
Capacitor, Cordova, Flutter, UnityFrameworkonly in hybrid or embedded-content apps

Note how many of those are transitive. You did not install nanopb. You installed Firebase, which installed gRPC, which installed nanopb. That is the actual shape of this problem, and it is why "just check your dependencies" is not useful advice.

Finding the responsible framework

# 1. Which packages already ship a manifest?
find node_modules -name "PrivacyInfo.xcprivacy" | sed 's|node_modules/||' | cut -d/ -f1 | sort -u

# 2. Which frameworks are actually in the built app?
find ios/build -name "*.framework" -maxdepth 6 2>/dev/null | xargs -n1 basename | sort -u

# 3. Which of those have a manifest inside them?
for f in $(find ios/build -name "*.framework" -maxdepth 6 2>/dev/null); do
  [ -f "$f/PrivacyInfo.xcprivacy" ] || echo "NO MANIFEST: $(basename "$f")"
done

Then intersect step 3's output with Apple's list. The overlap is your answer.

Xcode's own aggregation is not reliable here. Expo's Apple privacy guide states plainly that "Apple does not correctly parse all the PrivacyInfo files included by static CocoaPods dependencies," and recommends walking node_modules and aggregating manually. If your project uses static frameworks — which many Expo projects do — do not assume the privacy report Xcode generates is complete.

The four ways out

1. Update the dependency. By far the most common fix. Most actively maintained libraries added PrivacyInfo.xcprivacy during 2024. Check the package's changelog for "privacy manifest" and bump.

2. Update the transitive pod, not the wrapper. If nanopb is the problem, updating @react-native-firebase/app may not move it — check Podfile.lock for the resolved version and, if necessary, pin the pod explicitly in the Podfile.

3. Replace the package. For abandoned libraries this is the only real answer. An unmaintained package that will never ship a manifest is now a shipping blocker, not just technical debt.

4. Remove it. Frequently viable, and frequently the fastest. A charting library used on one screen, a keyboard manager you added in 2022 and no longer need, an analytics SDK nobody reads — each one removed is a class of rejection removed.

What is not a way out: adding entries for the framework to your app's PrivacyInfo.xcprivacy. That does not satisfy the per-bundle requirement, and it produces an upload that fails the same way.

The cost, and why it is worth pre-checking

ITMS-91061 arrives after an upload. So the loop is build → upload → wait → read a message that does not name the package → guess → repeat. For an EAS build that is 15 to 40 minutes per iteration, and the message gives you a haystack rather than a needle.

shipcheck reads the dependency tree, the built products, and every manifest in it locally, before you build, and reports which listed SDK is missing a manifest — with Apple's clause quoted next to it. No repository upload, no account: it runs inside the Claude Code session you already have open. How it works.

Questions and answers

What does ITMS-91061 mean?

It means your app includes one or more frameworks that appear on Apple's list of SDKs requiring a privacy manifest, and at least one of them shipped without one. The message reads that your app includes frameworks that are missing privacy manifest requirements.

What is the difference between ITMS-91053 and ITMS-91061?

ITMS-91053 is about a missing reason declaration for an API category your code uses. ITMS-91061 is about a listed third-party SDK having no privacy manifest file at all. 91053 is usually fixed in a manifest; 91061 is usually fixed by updating or replacing a dependency.

Can I add a privacy manifest for a third-party framework myself?

Not legitimately in the framework's own bundle if it is a binary you do not control. Apple requires the manifest to be in the bundle that includes the executable or dynamic library, and states that a third-party SDK cannot rely on the app's manifest. The real fixes are updating, forking, replacing or removing.

Which React Native packages are most likely to cause ITMS-91061?

Anything pulling Firebase, the Facebook SDK, OneSignal, Lottie, Realm, SDWebImage, Kingfisher, RxSwift, Alamofire, AFNetworking or IQKeyboardManager. Also hermes, which is React Native's default JavaScript engine and is on Apple's list.

Does ITMS-91061 also require a signature?

Yes, where the listed SDK is used as a binary dependency. Apple's third-party SDK requirements page states that signatures are also required in those cases, and that any version of a listed SDK, plus anything repackaging one, is included in the requirement.

Cite this pageshipcheck. “ITMS-91061 — Missing privacy manifest.” Baker Ventures LLC, September 6, 2026. https://shipcheck.bakerventuresstudio.com/rejections/itms-91061-missing-privacy-manifest/