Skip to main content

Posts

Showing posts with the label App Store

Implementing iOS Privacy Manifests in Flutter: Avoid App Store Rejections

  If you have submitted a Flutter app to TestFlight or the App Store recently, you likely encountered a warning—or a rejection—citing   ITMS-91053: Missing API declaration . Apple now enforces strict declaration requirements for "Required Reason APIs." Even if your Dart code never directly touches  UserDefaults  or file timestamps, your dependencies do. Specifically, the ubiquitous  shared_preferences  package relies on  NSUserDefaults , and  path_provider  often triggers file timestamp checks. Ignoring this will result in binary rejection. This guide covers the root cause and the specific implementation required to make your Flutter  ios  build compliant. The Root Cause: Indirect API Usage Apple's initiative is designed to prevent "fingerprinting"—the practice of using device signals to track users without consent. To enforce this, they flagged a specific set of standard iOS APIs (Required Reason APIs) that are frequently abused fo...

Solved: Flutter App Rejected (ITMS-91061) Missing Privacy Manifest

  You have uploaded your Flutter iOS build to TestFlight or the App Store, and the binary was immediately rejected or flagged with the following warning: ITMS-91061: Missing Privacy Manifest  – Your app includes "flutter_local_notifications", which accesses the following API categories: NSPrivacyAccessedAPICategoryUserDefaults. However, a privacy manifest file for this framework could not be loaded. You likely already have a  PrivacyInfo.xcprivacy  file in your project. You may have even audited your own native code. Yet, the rejection persists. This occurs because Apple’s static analyzer detects usage of "Required Reason APIs" (specifically  UserDefaults ) inside the compiled binary of a transitive dependency (the Flutter plugin), but that dependency failed to bundle its own privacy manifest during the CocoaPods/Framework embedding process. Here is the root cause analysis and the definitive fix to unblock your release. Root Cause Analysis: The Transitive Depend...