XCFramework Doctor Join the pilot

For iOS SDK vendors

Catch ITMS-91053 before your customers do.

When your binary SDK uses a required-reason API that its privacy manifest doesn't declare, App Store Connect emails your customer, not you. XCFramework Doctor scans the compiled .xcframework in your release CI and fails the build first.

4 of 6

current public SDK releases we scanned on 3 November 2026 reference required-reason APIs that their privacy manifest doesn't declare. They include a 3-D Secure payments SDK and a product-analytics SDK.

Static analysis of each vendor's latest Swift Package Manager binary. A finding means the API is referenced in the binary and missing from the manifest. Whether App Store Connect flags it for a given app is up to Apple.

What it checks, per slice

Required-reason APIs

Reads the Mach-O's imported symbols, constants, Objective-C classes and selectors for all five categories (file timestamps, boot time, disk space, active keyboards, UserDefaults) and diffs them against PrivacyInfo.xcprivacy.

Manifest validity

Missing manifests per platform slice, unexpected keys (rejected at upload), invalid reason codes, tracking enabled without tracking domains.

Swift ABI drift

Swift binaries shipped without a .swiftinterface, and, during the pilot, public interface changes between your last release and this one.

Every slice

Each device and simulator slice in the XCFramework is checked separately, for iOS, tvOS, visionOS and watchOS, dynamic frameworks and static libraries. macOS slices are reported but not checked, because the rules don't apply there.

A real report

The current release of a widely used 3-D Secure payments SDK, anonymised.

$ xcfdoctor PaymentsSDK.xcframework
PaymentsSDK.xcframework  signed=True team=XXXXXXXXXX
- ios-arm64 (arm64)
    [error] required-reason: NSPrivacyAccessedAPICategoryUserDefaults not declared;
            referenced via NSUserDefaults
- ios-arm64_x86_64-simulator (arm64, x86_64)
    [error] required-reason: NSPrivacyAccessedAPICategoryUserDefaults not declared;
            referenced via NSUserDefaults
2 errors, 0 warnings, 0 info
$ echo $?
1

Its manifest is present but declares no API types. Other SDKs in the scan were missing a manifest entirely, or referenced stat() and NSURLCreationDateKey without declaring file timestamps.

How it runs

The scanner behind the report above works today. Pilot vendors get the rest as it ships:

  1. Free CLI (works today): runs locally on any Mac with Xcode. Your binary never leaves your machine.
  2. GitHub Action (built with pilot vendors): blocks the release on errors and posts a PR comment with each slice's findings.
  3. History (built with pilot vendors): what changed between releases (new APIs, new symbols, interface changes), so you can ship a changelog your customers' compliance teams trust.

Pricing

Vendor

$99/month
  • Up to 3 SDKs
  • GitHub Action + release gate
  • Release-to-release history

Team

$249/month
  • Unlimited SDKs
  • Swift ABI drift reports
  • Customer-facing compliance changelog

The CLI stays free. Pilot vendors keep the pilot price for 12 months.

Become a pilot vendor

We're taking 10 SDK vendors for a pilot. You send one public or private release (or run the CLI yourself), and we deliver a full report within 2 working days and set up the Action in your release workflow. Tell us about your SDK:

Would you pay $99/month for this once it runs in your CI?

We only use your email to reply about the pilot. No newsletter, and nothing shared.

Questions

Doesn't Apple already check this?

Only when an app is uploaded to App Store Connect. The email goes to the app developer, and Apple's documentation tells them to contact the SDK vendor. Nothing in Xcode checks your binary against your manifest before you release it.

Do you need our source code?

No. It reads the compiled XCFramework, the same artifact your customers download. The CLI runs on your own machine.

Code signing?

Once you sign an XCFramework, Xcode verifies that signature in your customers' builds. Apple also requires signatures for SDKs on its list of commonly used third-party SDKs. We flag unsigned releases (3 of the 6 we scanned were unsigned), but signing is something you set up once, so we don't charge for it.

Who builds this?

An independent iOS developer with a background in Mach-O reverse engineering, who ships his own apps on the App Store.