Privacy

    Why did Apple reject my app for 5.1.1 missing AdMob manifest?

    App Store Connect rejection notice citing Guideline 5.1.1 for a missing PrivacyInfo.xcprivacy file inside the GoogleMobileAds SDK on an iOS app submission

    If your build came back this week with a Guideline 5.1.1 rejection naming the Google Mobile Ads SDK and a missing privacy manifest, you are looking at the most common shape of this rejection in 2026. The reviewer is not asking you to remove ads. They are saying the GoogleMobileAds binary inside your bundle does not declare what it touches under Apple's required reason API rules, and Apple has stopped letting that pattern through automated review.

    Short answer

    The Guideline 5.1.1 rejection for a missing AdMob privacy manifest fires when the Google Mobile Ads SDK in your app does not ship a PrivacyInfo.xcprivacy file, or when the SDK version predates manifest support. Google added manifest declarations in Mobile Ads SDK 11.2.0 in April 2024. Apple's policy on privacy manifest files blocks any new app or update that ships a privacy-impacting SDK from the published list without a manifest. Updating GoogleMobileAds to the current 12.x line, embedding the framework correctly, and matching the required reason API entries in your own PrivacyInfo.xcprivacy clears the rejection most of the time.

    What you should know

    • GoogleMobileAds is on Apple's published SDK list. Apple's list of commonly used SDKs that need a privacy manifest names GoogleMobileAds explicitly, alongside Firebase, Facebook SDK, and the major analytics frameworks.
    • Mobile Ads SDK 11.2.0 is the earliest version with manifest support. Anything older, including pinned versions in older CocoaPods or SwiftPM lockfiles, does not contain a PrivacyInfo.xcprivacy file inside the framework.
    • The error code is ITMS-91061, but the human rejection often cites 5.1.1. Apple's automated layer flags ITMS-91061 in App Store Connect. The human letter that follows uses Guideline 5.1.1 Data Collection and Storage as the policy frame.
    • Required reason API entries are separate from the SDK manifest. Even with the right SDK version, the app's own PrivacyInfo.xcprivacy must list the disk space, user defaults, file timestamp, and system boot time reasons that match what your code touches.
    • Embed and Sign matters for manifest discovery. Frameworks set to Do Not Embed sometimes fail to ship the manifest into the archive, and Xcode's privacy report comes back empty.

    What does the rejection letter usually say?

    The standard letter cites Guideline 5.1.1, Data Collection and Storage. The body of the letter names the SDK that triggered it, almost always one of three forms: GoogleMobileAds, Google-Mobile-Ads-SDK, or the umbrella package name when the team integrated through Firebase. The letter then asks for a privacy manifest that declares the data types collected and the required reason APIs accessed.

    When the rejection is automated, it surfaces inside App Store Connect as the ITMS-91061 validation error: "Missing privacy manifest". Apple's developer forum thread on ITMS-91061 confirms that the rule began as a warning in spring 2024 and was upgraded to a hard block on February 12, 2025 for new apps and updates that include a privacy-impacting SDK. The 5.1.1 letter is the version sent when a human reviewer reads the same finding and writes it in policy language.

    Why does Apple cite 5.1.1 instead of the ITMS code?

    The ITMS code is the validator's internal identifier. The reviewer letter is written in App Review Guideline language because that is the policy frame the team can appeal under. Guideline 5.1.1 covers the broader rule that an app must accurately disclose what it collects. A missing privacy manifest is the technical evidence that the disclosure is incomplete: Apple cannot match the App Privacy nutrition label against an SDK that did not declare its own data collection.

    In practice, you will see both. The CI pipeline shows the ITMS warning during upload. The human rejection cites 5.1.1 a few hours later. Both point at the same fix.

    Which Google Mobile Ads SDK versions ship the privacy manifest?

    Google added manifest support in Mobile Ads SDK 11.2.0, released in April 2024. The 12.x line, shipped through 2025, refines the manifest entries and trims the required reason API surface the SDK touches internally. Older versions, including the 10.x and 11.0.x lines that many projects pinned during the WKWebView transition, do not contain a PrivacyInfo.xcprivacy file inside the GoogleMobileAds framework.

    According to Google's AdMob data disclosure documentation, the developer is responsible for checking the privacy manifest and ensuring the app's data disclosures match. The same page notes that when using mediation, every adapter and mediated SDK must independently ship its own manifest. A single mediation adapter on an older version is enough to fail the rule.

    What does the GoogleMobileAds privacy manifest actually declare?

    The GoogleMobileAds manifest declares the data types the SDK collects (advertising data, device identifiers, IP address, performance signals, crash logs), the purposes (advertising, analytics), and the required reason APIs it accesses. The required reason set typically covers four entries:

    • File timestamp APIs under category NSPrivacyAccessedAPICategoryFileTimestamp
    • System boot time APIs under category NSPrivacyAccessedAPICategorySystemBootTime
    • Disk space APIs under category NSPrivacyAccessedAPICategoryDiskSpace
    • User defaults APIs under category NSPrivacyAccessedAPICategoryUserDefaults

    The specific reason codes are listed in Apple's required reason API documentation. The manifest inside the SDK declares the reasons for the SDK's own access. The app's own PrivacyInfo.xcprivacy declares the reasons for any access the app itself makes. The two manifests stack.

    What is the fix sequence that actually clears the rejection?

    The fix has five parts. Each part has its own failure mode that produces a re-rejection.

    StepWhat to doCommon mistakeWhere it surfaces
    1. Update GoogleMobileAdsMove to 11.2.0 or later, current 12.x preferredStale lockfile pins 10.x or 11.0.xITMS-91061 on upload
    2. Update mediation adaptersBump every adapter (AppLovin, ironSource, Unity, Meta)Adapter older than the core SDKMediation debugger warning
    3. Verify embed settingSet GoogleMobileAds framework to Embed and SignSet to Do Not Embed, manifest missing in archiveEmpty Xcode privacy report
    4. Add app PrivacyInfo.xcprivacyDeclare app-side required reason API entriesRelying only on SDK manifests5.1.1 letter cites missing app declaration
    5. Match App Privacy nutrition labelUpdate App Store Connect to reflect AdMob data typesLabel still says no third-party collection5.1.1 letter mentions mismatch

    For most React Native, Expo, Flutter, and FlutterFlow projects the first three steps live in the iOS native layer and may need a clean build and a fresh pod install. For builders that compile in the cloud, the SDK version is whatever the platform ships, and the only lever is to wait for the platform to update or to switch to a builder version that pins a recent SDK.

    Does AdMob mediation change anything?

    Yes. Each mediated SDK ships its own privacy manifest, and Apple checks them independently. Apple's list of commonly used SDKs that require a manifest includes most of the major ad networks: AppLovin, ironSource (Unity LevelPlay), Meta Audience Network, and Vungle. A 5.1.1 rejection naming AdMob can in fact be triggered by an older AppLovin or ironSource adapter pulled in by the GoogleMobileAds mediation graph.

    The AppLovin tracker issue #318 documented this exact pattern in 2024, where the mediation debugger flagged a missing required reason API on the AdMob adapter even when the core AdMob SDK was current. The fix is to bump each adapter to a version that ships its own PrivacyInfo.xcprivacy and to verify the per-adapter manifest in the Xcode privacy report.

    What to watch out for

    A common mistake is to add a single PrivacyInfo.xcprivacy at the app target root that declares it stands in for all SDKs. That is not how the rule reads. Each SDK on Apple's published list must ship its own manifest inside its own bundle. The app-level manifest only covers the app's own code.

    A second mistake is to set the framework embedding to Do Not Embed. The frameworks contain manifests, but Xcode does not copy them into the archive when embedding is disabled. The privacy report Xcode generates from the archive comes back empty, and the App Store Connect validator reports ITMS-91061. The fix is to set Embed and Sign on the GoogleMobileAds framework and rebuild.

    A third mistake is to assume the App Privacy nutrition label in App Store Connect is independent of the manifest. It is not. Apple cross-checks the manifest declarations against the nutrition label, and a 5.1.1 letter can name a mismatch between the two as the rejection reason even when both files exist. For builders who want to scan a compiled IPA before submission to confirm which SDKs are present, which versions, and whether each one ships a PrivacyInfo.xcprivacy, PTKD.com (https://ptkd.com) is one of the platforms that maps the framework symbol table against the published SDK list and surfaces the gaps in plain language.

    Key takeaways

    • The 5.1.1 rejection naming AdMob and a missing privacy manifest is the same finding as ITMS-91061 written in policy language. Apple's strict enforcement of the rule has been live since February 12, 2025.
    • Google Mobile Ads SDK 11.2.0 was the first version to ship a PrivacyInfo.xcprivacy file inside the framework. The 12.x line is what reviewers expect to see in a new submission.
    • Mediation adapters are checked independently. An older AppLovin, ironSource, Unity, or Meta adapter pulled in by the AdMob mediation graph is enough to trigger the rejection even when the core SDK is current.
    • The app's own PrivacyInfo.xcprivacy declares the reasons for any app-side access to required reason APIs and stacks on top of the per-SDK manifests. A single app-level manifest cannot substitute for the per-SDK ones.
    • Some teams outsource the pre-submission check entirely to platforms like PTKD.com (https://ptkd.com), which read a compiled IPA against Apple's published SDK list and report which frameworks are missing a manifest before App Store Connect does.
    • #guideline 5.1.1
    • #privacy manifest
    • #admob
    • #google mobile ads sdk
    • #itms-91061
    • #app store rejection
    • #required reason api

    Frequently asked questions

    Is ITMS-91061 the same finding as a Guideline 5.1.1 rejection?
    Yes, in practice they are the same finding written in two different registers. ITMS-91061 is the App Store Connect validator code that flags a privacy-impacting SDK without a manifest at upload. Guideline 5.1.1 is the policy clause the human reviewer cites when the automated block lets the build through but the manifest is still missing or incomplete. Both point at the same fix: the SDK, the app manifest, and the App Privacy nutrition label have to line up.
    Which Google Mobile Ads SDK version has the privacy manifest?
    Google Mobile Ads SDK 11.2.0, released in April 2024, was the first version to ship a PrivacyInfo.xcprivacy file inside the framework. The current 12.x line refines the entries and reduces the required reason API surface the SDK touches internally. Versions before 11.2.0, including the 10.x and 11.0.x lines that many CocoaPods or SwiftPM lockfiles pinned, do not contain a manifest at all and will trip ITMS-91061 on upload.
    Do I still need an app PrivacyInfo.xcprivacy if AdMob has one?
    Yes. The SDK manifest declares the SDK's own access to required reason APIs and data collection. The app PrivacyInfo.xcprivacy declares the reasons for any access your own code makes, plus the tracking domains and the data types the app itself collects. The two manifests stack. Apple's reviewers expect both files in the archive, and a missing app-level manifest is enough to trigger a Guideline 5.1.1 letter even when every SDK is current.
    Why does Xcode's privacy report come back empty after I added the SDK?
    The frameworks ship the manifests inside the bundle, but Xcode only copies them into the archive when the framework is set to Embed and Sign. If GoogleMobileAds is set to Do Not Embed in the target's Frameworks, Libraries, and Embedded Content list, the privacy report generated from the archive comes back empty and the App Store Connect validator reports ITMS-91061 on upload. Switch the embedding to Embed and Sign, archive again, and the manifests appear.
    Does AdMob mediation pull in other SDKs that need their own manifests?
    Yes. AdMob mediation can pull in AppLovin, ironSource, Unity Ads, Meta Audience Network, and Vungle adapters, and each one is on Apple's published list of SDKs that require a manifest. Apple checks every framework in the bundle independently, so an older adapter is enough to trigger a 5.1.1 rejection naming AdMob. Bump every adapter to a version that ships its own PrivacyInfo.xcprivacy and verify each one in the Xcode privacy report.

    Keep reading

    Scan your app in minutes

    Upload an APK, AAB, or IPA. PTKD returns an OWASP-aligned report with copy-paste fixes.

    Try PTKD free