Detects apps that send user data to third-party AI systems without explicit in-app consent and disclosure, enforcing Guideline 5.1.2(i).
Install
npx skillscat add cruisediary/apple-app-review-skills/ai-data-disclosure Install via the SkillsCat registry.
Skill: AI Data Disclosure
Purpose
Detects apps that send user data to third-party AI systems (OpenAI, Google Gemini, Anthropic, etc.) without explicit in-app consent and disclosure, enforcing Guideline 5.1.2(i) which requires transparency before any user data is transmitted to external AI services.
Apple Guideline
- Primary: 5.1.2(i) — Privacy: Third-Party AI Data Sharing
- Related: 5.1.1(i) — Privacy Policy
- Reference:
references/guidelines/5-legal.md
Real-World Rejection Cases
Case: App sent user messages to OpenAI API without disclosing this in the app or privacy policy — rejected under 5.1.2(i)
Source: Apple Developer Forums (multiple developer reports, 2023–2024)
Root cause: Guideline 5.1.2(i) requires explicit disclosure and user consent before transmitting data to any third-party AI system — a generic "we may share data with service providers" clause in the privacy policy is insufficient; the app must present a clear in-app notice before AI processing occursCase: Health app transcribed user speech on-device and then sent transcripts to a third-party LLM for analysis — rejected for undisclosed AI data sharing
Source: Apple Developer Forums (2024)
Root cause: Any transmission of user-provided content to an external AI service requires explicit opt-in consent, regardless of whether the data was first processed on-device — the forwarding to an external AI is the disclosure trigger
Trigger
Invoke on any iOS/macOS project that integrates AI/ML APIs, chat features, or sends user-generated content to external services.
Inputs
| Name | Type | Default | Description |
|---|---|---|---|
project_root |
path | cwd | iOS/macOS project root |
shared_context |
object | nil | Pre-collected context from appstore-full-audit Phase 1 |
Actions
Phase 1: Context Collection
Skip this phase if shared_context is provided.
Glob**/*.swift— collect all Swift source files.Glob**/Podfile**/Package.resolved— locate dependency manifests for AI SDK detection.Glob**/*Privacy***/*privacy***/PrivacyPolicy*— locate privacy policy documents.
Phase 2: Checks
Third-party AI SDK or endpoint detection
GreppatternOpenAI|openai|ChatGPT|chatgpt|GoogleGenerativeAI|GenerativeAI|Anthropic|anthropic|Cohere|cohere|HuggingFace|mistralin**/*.swiftand dependency manifests.
AlsoGrep"api\.openai\.com"|"generativelanguage\.googleapis\.com"|"api\.anthropic\.com"|"openrouter\.ai"in**/*.swift.
If any match found → proceed to checks 2–4.Explicit AI data consent / disclosure UI
GreppatternaiConsent|ai_consent|AIDisclosure|aiDisclosure|dataSharingAI|processedByAI|thirdPartyAI|aiDataUsagein**/*.swift.
If AI SDK/API detected (check 1) but consent pattern absent → 🔴 CRITICAL. Apps must present explicit disclosure before sending user data to any third-party AI system.Privacy policy AI disclosure
Greppattern"AI"|"artificial intelligence"|"language model"|"OpenAI"|"Gemini"|"third-party AI"in privacy policy files.
If AI APIs are used but privacy policy does not mention AI data sharing → 🟠 HIGH. The privacy policy must specifically disclose which AI services receive user data and why.Sensitive data + AI combination
GreppatternHKHealthStore|CMMotionActivity|CNContact|CLLocationin**/*.swift.
If health, motion, contacts, or precise location data is accessed AND third-party AI is present → 🟠 HIGH. Sending sensitive categories to AI services requires heightened disclosure and explicit opt-in.
Phase 3: Output
Collect all findings from Phase 2 and build the prioritised findings list below. Include file paths and line numbers. Omit tiers with no findings.
Output Format
## AI Data Disclosure — Findings
### 🔴 CRITICAL — Guaranteed rejection
- [ ] TODO: Add explicit in-app disclosure and user consent before sending data to OpenAI API — users must opt in before any content is transmitted to a third-party AI system — `ChatViewModel.swift:45` — Guideline 5.1.2(i)
### 🟠 HIGH — Very likely rejection
- [ ] TODO: Update privacy policy to explicitly disclose OpenAI data sharing — generic "third-party services" language is insufficient — Guideline 5.1.2(i)
- [ ] TODO: Add heightened consent for health data being processed by an external AI — `HealthChatService.swift:22` — Guideline 5.1.2(i)
### 🟡 MEDIUM — Possible rejection
- [ ] TODO: Consider on-device alternatives (Core ML, Apple Intelligence APIs) for AI features — avoids third-party disclosure requirements entirely
### 🟢 LOW — Best practice
- [ ] TODO: Allow users to opt out of AI-assisted features without losing core app functionality — granular consent improves compliance postureTools Used
Glob, Grep, Read
Constraints
- Read-only. No file edits.
- No network calls.
- Skip Phase 1 if
shared_contextis provided by orchestrating agent. - On-device ML using Core ML, Create ML, or Apple's on-device frameworks (Vision, NaturalLanguage, Sound Analysis) does not trigger this guideline — only external API calls to third-party AI services.
Quick Commands
# Check for AI SDK dependencies
!grep -rn "OpenAI\|openai\|GoogleGenerativeAI\|Anthropic\|anthropic\|ChatGPT" . --include="*.swift" --include="Podfile" --include="Package.resolved" | grep -v "//"
# Check for AI API endpoints
!grep -rn "api\.openai\.com\|generativelanguage\.googleapis\|api\.anthropic\.com" . --include="*.swift"
# Check for consent/disclosure UI patterns
!grep -rn "aiConsent\|AIDisclosure\|dataSharingAI\|processedByAI" . --include="*.swift"Swift Anti-Pattern Reference
examples/swift/AIDisclosurePatterns.swift
Detection Steps
Find target files
- Glob:
**/*.swift,**/*.m,**/Podfile,**/Package.swift
- Glob:
Search for rejection patterns
- Grep
OpenAI\|openai\|GPT\|ChatGPT— OpenAI SDK or API usage - Grep
GoogleGenerativeAI\|gemini\|Gemini— Google Gemini usage - Grep
Anthropic\|claude\|Claude— Anthropic SDK usage - Grep
URLSession.*openai\.com\|URLRequest.*anthropic\.com— direct API calls - Grep
aiDisclosure\|aiConsent\|dataSharing.*AI\|AIDataSharing— disclosure UI implementation
- Grep
Determine verdict
- Any AI SDK/API found + no disclosure UI (
aiDisclosure/aiConsent) → 🔴 CRITICAL (Guideline 5.1.2(i)) - AI SDK found + disclosure present but generic privacy policy only → 🟠 HIGH
- Explicit in-app disclosure naming the AI provider found → 🟢 pass
- Any AI SDK/API found + no disclosure UI (
Report
- File path + line where AI SDK is imported or API is called
- Fix: Present an explicit modal before first API call naming the provider (e.g., "This app uses OpenAI to process your messages") with affirmative consent button