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.
For iOS SDK vendors
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.
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.
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.
Missing manifests per platform slice, unexpected keys (rejected at upload), invalid reason codes, tracking enabled without tracking domains.
Swift binaries shipped without a .swiftinterface, and, during the pilot, public interface changes between your last release and this one.
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.
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.
The scanner behind the report above works today. Pilot vendors get the rest as it ships:
The CLI stays free. Pilot vendors keep the pilot price for 12 months.
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:
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.
No. It reads the compiled XCFramework, the same artifact your customers download. The CLI runs on your own machine.
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.
An independent iOS developer with a background in Mach-O reverse engineering, who ships his own apps on the App Store.