Xcode 27 PrivacyInfo.xcprivacy Missing From Archive? 2026 Troubleshooting

Xcode 27 PrivacyInfo.xcprivacy Missing From Archive? 2026 Troubleshooting

Apple documents PrivacyInfo.xcprivacy as a property-list privacy manifest for an app or third-party SDK (Apple’s manifest guidance). If Xcode 27’s Archive appears to omit it, inspect the final .xcarchive first—not the project navigator. Then trace the missing file to its app target, Swift Package resource declaration, SDK bundle, or product-specific bundle path. If the file is present, validate its contents separately.

For iOS developers: diagnose a missing app manifest or a submission validation error.
For mobile CI engineers: verify that Swift Package resources and SDK manifests reach the archived product.
For DevOps engineers: reproduce local-versus-remote Mac differences with evidence from the same commit and scheme.

Last updated October 5, 2026; version and manifest rules checked against Apple’s Xcode page, privacy manifest guidance, and the linked Apple documentation below. Xcode 27 is the toolchain context here; this guide does not assume that it changed Apple’s privacy manifest rules.

Xcode 27 PrivacyInfo.xcprivacy Archive: start with the artifact

Treat the archive as the evidence boundary. A file visible in the repository proves only that the source exists. It does not prove that the Archive action copied it into the right product bundle, preserved an SDK’s bundle structure, or included the resources resolved by the CI build.

Use this sequence:

  1. Locate the .xcarchive produced by the exact Archive action you are investigating.
  2. Inspect its Products/Applications directory and identify the archived .app.
  3. Search within that app bundle for PrivacyInfo.xcprivacy.
  4. Inspect embedded frameworks and resource bundles separately. A manifest may belong to a framework or SDK bundle rather than the app bundle root.
  5. Record the path, file contents, build log, active Xcode version, and resolved dependencies before changing the project.

The exact bundle path depends on the product type. Apple’s bundle content guidance explains why you should check the archived bundle structure rather than apply one path rule to every product.

Scenario Evidence to inspect Likely investigation path Evidence strength*
App’s own manifest absent Archived .app contents App target membership, resource build phase, Archive configuration High
Swift Package manifest absent Package resource bundle and final app Package resource declaration, package build output, integration High
Third-party SDK manifest absent Embedded framework or SDK bundle SDK contents, dependency version, preserved bundle layout High
File present but validation fails Archived plist and privacy report Plist syntax, supported keys and values, API reason declarations High
Local and remote archives differ Logs and contents from both archives Xcode selection, scheme, build settings, dependency resolution High

*Evidence strength is a diagnostic ranking, not a benchmark: direct inspection of the final artifact is stronger than an assumption based on source files or project navigator visibility.

App target versus source folder

If the app’s own manifest is missing, first establish whether the active Archive target owns the file. In Xcode, select PrivacyInfo.xcprivacy and confirm its target membership. Then inspect the target’s resource build phase and the configuration selected by the Archive action. A file can be present in the repository but excluded from the target that produces the distribution archive.

Compare the failing Archive scheme with a known-good build using the same target and configuration. Do not rely on a Debug build as proof that Release or Archive copies the same resources. Build settings, conditional project generation, and target-specific resource phases can produce different outputs.

Use the archive’s actual app bundle to settle the question. If the manifest is absent there, the fault is in target inclusion, resource copying, or the build configuration—not in the manifest’s privacy declarations. If the file is present, move to content validation rather than repeatedly changing target membership.

For reproducible checks, save the archive path and a file listing of the relevant bundle. Keep those records with the build log. This makes later comparisons useful even when the workspace or dependency checkout has changed.

Swift Package source versus packaged resources

A Swift Package manifest must follow the package’s resource rules. Its location somewhere under Sources does not, on its own, prove that the package target will process or copy it. Review the package target declaration and resource handling against Apple’s Swift Package resource guide.

Check two separate outputs:

  • Package output: determine whether the package build produced the expected resource bundle and whether the manifest is in that bundle.
  • Application archive: determine whether the package output and its bundle structure are present in the archived app.

These checks separate a package that never declared the manifest as a resource from an application integration problem. If the package build output lacks the file, fix the package resource declaration or ask the package maintainer to correct the release. If the package output contains it but the archive does not, inspect dependency integration and the actual archived bundle layout.

Do not copy the package’s manifest into the app target simply to make a file appear. The package’s own manifest describes that package’s privacy practices. An app-level manifest does not substitute for a missing SDK or package manifest, and duplicate declarations can make the evidence harder to interpret.

Inspection layer What a pass proves What it does not prove
Repository or package checkout The source file exists at that revision That Xcode packaged it
Package build output The package resource rule produced the file That the app archive retained the bundle
Final .xcarchive The manifest is present at the inspected bundle path That its plist and declarations are valid

SDK bundle versus app-level declaration

A third-party SDK may supply its own privacy manifest. Inspect the SDK version actually resolved by the build, not just the repository’s dependency declaration. For a binary framework, inspect the framework or embedded SDK bundle itself and confirm that the manifest remains in the bundle after Archive.

Apple maintains current third-party SDK requirements. Check that page for the SDKs and submission requirements that apply at release time; do not assume that every app or every dependency has the same manifest obligation. If an SDK is listed or its vendor documents a manifest, establish whether the exact version you ship includes it.

Responsibility is shared but distinct. The SDK supplier is responsible for describing the SDK’s practices and shipping the required manifest. You are responsible for integrating the supplied version and preserving its bundle structure in your app. If the SDK bundle lacks the file, raise the issue with the supplier or update to a corrected release. Do not claim the SDK’s code behavior in your app manifest as a workaround.

Keep the original dependency artifact or a checksum-identified copy alongside your build evidence. If the manifest is missing in both the downloaded SDK and the archive, you have a supplier or dependency-version issue; if it appears before integration but not in the archive, investigate your packaging path.

Bundle path versus resource-copy failure

A manifest can be present in the archive and still be in the wrong place. The correct location depends on whether you are inspecting an app, a framework, or another product type. Use Apple’s bundle placement documentation to check the expected location for that product, then compare it with the archived bundle’s real directory structure.

Use these distinctions:

  • Path error: the file exists, but not at the location expected for that product.
  • Copy failure: the source or package output has the file, but the archived product does not.
  • Target mismatch: the file is packaged in a different target or product from the one being submitted.
  • Bundle-structure loss: a framework or SDK was copied or repackaged in a way that no longer preserves its expected resources.

Avoid moving files manually inside the completed archive to “fix” the path. An archive contains signed products, and modifying a signed bundle can invalidate its signature. Correct the project, package, or SDK integration, then create a fresh archive and verify that output.

Local archive versus remote Mac CI

When a local archive contains the manifest but a remote Mac CI archive does not, compare the build inputs before assuming that the remote machine has a different rule. Use the same commit and Archive scheme for both runs. Record the active Xcode selection, build configuration, dependency resolution output, and relevant archive log. Then inspect the same app, framework, and package bundle paths in both artifacts.

Follow this order:

  1. Confirm both runs use the same commit and generated project state.
  2. Compare the active Xcode version and selected Archive scheme.
  3. Compare build configuration and target resource phases.
  4. Compare resolved Swift Package revisions and binary SDK versions.
  5. Compare archived bundle listings, not just build success messages.
  6. Save the logs, dependency records, and archive inspection results with the CI run.

If the inputs differ, fix the environment or dependency resolution first. If the inputs match but the file is missing from both archives, return to target or resource configuration. If only one archive is missing it, investigate the differing build input that the comparison identifies. A remote Mac CI node can provide a repeatable macOS archive environment, but it cannot make an omitted resource or inaccurate manifest valid by itself.

Missing file versus invalid privacy declaration

Presence is not validation. Apple’s TN3181 troubleshooting note addresses invalid privacy manifests. Use it when the archived file exists but Xcode or submission validation reports a problem.

Check these categories separately:

  • Property-list syntax: can the archived file be parsed as a valid plist?
  • Recognized keys and values: do the manifest entries follow Apple’s current schema and accepted values?
  • Required-reason API declarations: do the declared reasons match the APIs used by the app or SDK? Apple explains how to describe data use in privacy manifests and how to declare required-reason API use.
  • Report evidence: does the archived privacy report reflect the manifest you inspected, or a different product or build?

Do not turn a missing-file error into a content edit, or a content error into a resource-copy change. If validation flags the manifest, correct the source declaration and rebuild. Do not patch the archived plist after signing; produce and validate a new archive instead.

Choose the next check from the evidence

Use these branches to avoid changing several variables at once:

  • If the file is absent from the archived app and belongs to the app target, check target membership, resource phases, and the Archive configuration. Otherwise, return to the target or package that owns the resource.
  • If the file is absent from a package resource bundle, correct the Swift Package resource declaration or request a corrected package release. If it exists in the package output, trace its integration into the app archive.
  • If an SDK bundle lacks its expected manifest, confirm the resolved SDK version and inspect the supplier’s release artifact. If the source SDK contains it, investigate whether integration preserved the bundle.
  • If the file is present but in an unexpected location, verify the product-specific bundle placement before changing build phases. If the path is correct, validate the file contents.
  • If the manifest parses but validation still fails, check recognized values and required-reason API declarations against Apple’s current documentation. If they are correct, use the validation report to identify the exact product or manifest being evaluated.
  • If local and CI outputs differ, compare Xcode selection, scheme, build settings, and resolved dependencies first. If those match, compare resource-copy logs and archived bundle listings.

This decision path scores evidence, not the quality of your code: the final archive tells you what shipped, while source and build records explain why.

FAQ: archive manifest checks

Why can a manifest exist in the project but not in the iOS archive?

A file in the repository is only source input; it may not belong to the archived app target or be copied by the active build configuration. Inspect the exported .xcarchive and the relevant .app or framework bundle. If the file is absent there, compare target membership, build phases, and the scheme used for Archive before changing manifest contents.

How do I include a Swift Package manifest in the final app?

Declare the manifest as a package resource using the package’s resource rules, then build and inspect the package resource bundle and final archive. Do not assume a file under Sources is automatically copied. If the package bundle contains the manifest but the app archive does not preserve it, investigate integration and bundle layout rather than adding a duplicate app-level declaration.

How can I verify SDK manifests in a remote Mac CI archive?

Use the same commit and archive scheme as the local comparison. Record the active Xcode version, resolved dependency revisions, and archive log, then inspect the .xcarchive for each embedded framework or SDK bundle and its PrivacyInfo.xcprivacy. This separates a CI dependency or build-input difference from an SDK package that never supplied a manifest.

What should I check when the manifest exists but submission validation still fails?

Treat presence and validity as separate checks. Validate the property list, confirm that keys and values match Apple’s current manifest requirements, and compare required-reason API declarations with the code that uses those APIs. Use Apple’s invalid-manifest guidance and the archived privacy report. Fix the source and create a new signed archive instead of editing the archived bundle.

If your local and CI archives still diverge after you compare the same commit, scheme, Xcode selection, and dependency revisions, the current setup may be hiding build-input differences across machines. A Linux-based build host cannot produce an Xcode archive, while an ad hoc local Mac can be difficult to keep consistent and auditable across releases. For a repeatable macOS build node, compare the MacDate remote Mac options with your existing setup; if you only need an occasional validation environment, compare the Mac mini cost and ownership trade-offs before committing to dedicated hardware.

Further Reading