← Back to Field Notes & Guides
March 14, 2026 • 8 min read

Auditing Apple Privacy Manifests & NSPrivacyAccessedAPITypes

A technical guide to auditing compiled iOS binaries and embedded XCFrameworks for undeclared system API accesses and required reason codes.

By Tanakorn Ruangrit, Senior Mobile Telemetry Practice
Auditing Apple Privacy Manifests & NSPrivacyAccessedAPITypes

With Apple’s enforcement of Privacy Manifests (PrivacyInfo.xcprivacy), every application submitted to the App Store must account not only for its own source code API calls, but also for every low-level platform call executed by embedded third-party static and dynamic frameworks.

When an app bundle contains an SDK accessing sensitive platform APIs without a declared NSPrivacyAccessedAPICategory and a valid reason string, App Store Connect halts the build ingestion process.


The Four High-Risk API Categories

In our audit practice, four specific categories account for the vast majority of surprise App Store flags and hidden fingerprinting attempts:

1. System Boot Time APIs (NSPrivacyAccessedAPICategorySystemBootTime)

Many analytics frameworks historically invoked sysctl() with KERN_BOOTTIME or called mach_absolute_time() to determine the exact millisecond the device was booted. When combined with screen resolution and battery level, boot time acts as a persistent device fingerprint.

  • Permitted Reasons: Only specific diagnostics reasons (such as 35F9.1 to measure elapsed time between events inside the app) are accepted.
  • Audit Action: Search symbol tables for sysctl, sysctlbyname, and mach_absolute_time.

2. Disk Space APIs (NSPrivacyAccessedAPICategoryDiskSpace)

Third-party SDKs frequently call NSFileManager.default.attributesOfFileSystem(forPath:) or statfs() to calculate total and available bytes on the file system.

  • Permitted Reasons: Declaring that disk space is checked to verify whether space is available before downloading assets (e.g. E174.1).
  • Audit Action: Flag any SDK querying disk metrics that does not directly manage local file caching.

3. File Timestamp APIs (NSPrivacyAccessedAPICategoryFileTimestamp)

Querying file modification and creation timestamps on app container files or system bundles can be exploited to construct a unique installation timeline.

  • Permitted Reasons: Displaying file timestamps to the user inside a document management app (DDA9.1) or validating internal app cache freshness (C617.1).

4. User Defaults (NSPrivacyAccessedAPICategoryUserDefaults)

Reading or writing to UserDefaults requires declaring reason CA92.1 to access app-specific defaults.


Static Binary Inspection Technique

To inspect embedded frameworks within an IPA archive before submitting to Apple, we use nm and otool to trace symbol references:

# Decompress the IPA
unzip -q AppRelease.ipa -d AppExtracted

# Search for system boot time API symbols across all embedded frameworks
for fw in AppExtracted/Payload/YourApp.app/Frameworks/*.framework; do
  echo "Inspecting $fw"
  nm -gU "$fw"/* | grep -E "sysctl|statfs|mach_absolute_time"
done

If an embedded SDK contains these symbols without providing its own PrivacyInfo.xcprivacy bundle resource, your main application target must incorporate an aggregated manifest or replace the legacy dependency.

Have questions regarding this telemetry pattern?

We assist mobile development teams in conducting code reviews and restructuring live event pipelines.

Consult with an Auditor