Skip to content

fix(passkeys_darwin): declare a privacy manifest for Apple platforms - #317

Merged
spydon merged 1 commit into
mainfrom
fix/darwin-privacy-manifest
Sep 17, 2026
Merged

spydon merged 1 commit into
mainfrom
fix/darwin-privacy-manifest

Conversation

@spydon

@spydon spydon commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator

Declares the plugin's behavior on Apple platforms: no tracking, no data collected, and no required-reason API use.

Why the accessed-API list is empty

An empty NSPrivacyAccessedAPITypes is an affirmative claim that the plugin touches none of Apple's required-reason APIs, so it was checked rather than assumed. All five Swift sources were grepped for every category's symbols (file timestamps, UserDefaults, system boot time, disk space, active keyboard) plus Keychain and SecItem: zero hits. The imports are AuthenticationServices, LocalAuthentication, Foundation, Combine and Flutter, none of which are required-reason APIs, and Keychain is not on Apple's list either.

Without a manifest, apps embedding this plugin have nothing from us in the privacy report Xcode aggregates at submission.

Placement

passkeys_darwin is the only package in the repository with Apple native code, so one manifest covers iOS and macOS. It is wired into both build paths the plugin ships:

  • CocoaPods: a passkeys_darwin_privacy resource bundle, the same shape url_launcher_ios and the other first-party plugins use.
  • SwiftPM: resources: [.process("Resources")] on the target.

Testing

$ plutil -lint .../Resources/PrivacyInfo.xcprivacy   # OK
$ swift package describe --type json                 # manifest listed as a processed resource of passkeys_darwin
$ pod install                                        # generates the passkeys_darwin-passkeys_darwin_privacy bundle target

plutil -p confirms the plist parses with NSPrivacyTracking false and three empty arrays. The pod install run needed the example's Podfile temporarily raised to iOS 15.0, because Flutter 3.47's generated Flutter.podspec requires 15.0 while the example pins 13.0; CI is unaffected since it pins Flutter 3.44.5. flutter build ios was not run locally (Command Line Tools only, no Xcode), so the CocoaPods and SwiftPM build jobs in CI are the check for that.

Typed fix rather than chore on purpose: a chore commit produces no version bump, and the manifest only reaches consumers once passkeys_darwin is published.

The plugin's Swift sources touch no required-reason API: they import
AuthenticationServices, LocalAuthentication, Foundation and Combine only,
and Keychain is not on Apple's list, so the manifest declares no tracking,
no collected data and an empty accessed-API list.

Wired into both build paths, since the plugin ships SwiftPM and CocoaPods:
a resource bundle in the podspec and a processed resource in Package.swift.
@spydon
spydon merged commit 90a2af9 into main Sep 17, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant