Apple iOS 17 ile Privacy Manifest (PrivacyInfo.xcprivacy) dosyasını tanıttı. 2024 Mayıs’tan itibaren zorunlu. App Store’a submission yaparken bu dosya eksik veya yanlış doldurulmuşsa direkt reject.
12 iOS uygulamamın hepsine bu manifest’i ekledim. Öğrendiğim şey: Apple’ın dokümantasyonu ne yazman gerektiğini %70 anlatıyor, kalan %30 deneyimle öğreniliyor. Bu yazıda hangi field’ları nasıl doldurduğumu anlatacağım.
Privacy Manifest nedir?
XML formatında bir plist file. App’inin:
– Hangi kullanıcı verisini topladığı
– Bu veriyi hangi amaçla kullandığı
– Hangi Required Reason API’larını çağırdığı
– Hangi tracking domain’lere bağlantı kurduğu
Tüm bu bilgiler App Store Connect’e upload edilirken otomatik okunuyor ve public privacy report’una dönüştürülüyor.
NSPrivacyCollectedDataTypes
Bu array app’in topladığı her veri kategorisi için bir entry içeriyor.
Örnek: app user’ın email’ini topluyor, analytics için kullanıyor.
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeEmailAddress</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
</array>Key’ler:
- NSPrivacyCollectedDataType: Hangi veri (Email, Phone, Location, HealthData, etc).
- NSPrivacyCollectedDataTypeLinked: Bu veri user’ın identity’siyle linkli mi? (true = user ID ile stored)
- NSPrivacyCollectedDataTypeTracking: Third-party tracking için kullanılıyor mu? Apple’ın tracking tanımı (cross-app, cross-website).
- NSPrivacyCollectedDataTypePurposes: Neden topluyorsun? Analytics, AppFunctionality, DeveloperAdvertising, ProductPersonalization.
Required Reason APIs
iOS 17 belirli system API’larını “Required Reason” kategorisine aldı. Bu API’ları kullanıyorsan hangi amaç için kullandığını declare etmelisin.
API’lar şunlar (en yaygınları):
– UserDefaults (CA92.1)
– FileTimestamp (C617.1)
– SystemBootTime (35F9.1)
– DiskSpace (85F4.1)
– ActiveKeyboards (54BD.1)
Örnek: UserDefaults kullanıyorsun (tabii ki kullanıyorsun, her iOS app kullanıyor):
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>CA92.1 = “Access information from user defaults stored by the app itself”. Bu app’inin kendi UserDefaults’unu okuyorsun, başka app’in değil.
Her Required Reason API için kendi reason code’u var. Apple dokümanında full list mevcut.
NSPrivacyTracking
App tracking yapıyorsa bu true. Apple’ın tracking tanımı: verileri üçüncü parti verilerle birleştirip kullanıcıya ait profile oluşturuyorsa, bu tracking.
<key>NSPrivacyTracking</key>
<true/>Eğer sadece kendi analytics yapıyorsan (Mixpanel, kendi backend’in), bu genelde false.
Eğer Facebook SDK, Google Analytics, AdMob gibi advertising/tracking SDK kullanıyorsan true.
NSPrivacyTrackingDomains
Tracking domain’lerin list’i. Bu domain’lere giden request’ler, ATT (App Tracking Transparency) izni alınmadıysa bloke oluyor.
<key>NSPrivacyTrackingDomains</key>
<array>
<string>graph.facebook.com</string>
<string>doubleclick.net</string>
</array>Her tracking SDK’sının domain’leri burada. Yanlış eksik kalırsa SDK request’leri block olur, sessiz hata.
Third-party SDK manifest’leri
İşte burada işler karışıyor. Apple ayrıca kullandığın tüm SDK’ların da kendi Privacy Manifest’ine sahip olmasını istiyor. Popüler SDK’lar genelde artık manifest’li geliyor ama bazıları geri kalmış.
List of SDK’ları kontrol et:
– Firebase: ✓ Manifest var
– Alamofire: ✓
– RevenueCat: ✓
– Facebook SDK: ✓
– OneSignal: ✓
– AppsFlyer: ✓
– Branch: manifest yok (Custom SDK kullananlar için problem)
– Smaller/older SDK’lar: manifest eksik olabilir
Manifest’siz SDK’yı build’e dahil edersen App Store Connect upload’da warning veriyor. Release build’e geçmeden önce tüm SDK’ların güncel versiyonuna geçmen önerilir.
Upload sırasında validation
Xcode 15’te Archive yaparken:
Product > Archive
Organizer açılıyor
"Distribute App" > App Store Connect
Validation automaticValidation aşamasında eksik manifest, required reason API’ları açıklanmamış, tracking domain eksik gibi issue’lar tespit ediliyor.
Fix et, tekrar archive, tekrar validate. Upload’a geçmeden önce validation temiz olmalı.
Common mistakes
1. UserDefaults için reason eklememek. Her iOS app’te UserDefaults kullanılır. Eklemek unutuluyor.
2. Third-party SDK’yı manifest’siz bırakmak. Build warning’i ignore etmek. Apple submission’ı reject ediyor.
3. NSPrivacyTracking’i doğru set etmemek. Analytics topluyorsun ama Tracking’i false bırakıyorsun (doğru). Veya Facebook Ads kullanıyorsun ama Tracking’i false bırakıyorsun (yanlış, reject).
4. Data type’ları eksik beyan. App email topluyor ama manifest’te yok. Reject.
5. Purpose’ları yanlış seçmek. Analytics diye beyan etmişsin ama aslında advertising için kullanıyorsun.
Privacy Manifest file creation
Xcode’da:
- File > New > File
- Resource bölümü > App Privacy File
- PrivacyInfo.xcprivacy olarak ismini koy
- Xcode GUI’de field’ları doldur
- Project target’ına include et
Manuel XML yazmak da mümkün ama Xcode GUI daha güvenli, typo riski yok.
Incremental onboarding
Mevcut app’te manifest eklerken:
- Xcode GUI’den boş manifest oluştur
- Xcode’un “Privacy Report” feature’ını çalıştır (Product > Build For > Analysis)
- Rapor hangi API’ları/data type’ları missing olduğunu gösteriyor
- Rapora göre manifest’i doldur
- Re-analyze, warnings kalmadığında hazır
Bu workflow 1-2 saatlik iş. Sonra her yeni SDK veya feature ekledikçe manifest’i güncellemek 5-10 dakika.
Compliance testing
Submission öncesi son check:
- Xcode Privacy Report: App analyzed, manifest complete mi?
- App Store Connect validation: Archive yükleniyor, error mı var?
- Test with Tracking disabled. User “Ask App Not to Track” demiş. App crash etmiyor, feature’lar tolerate ediyor mu?
- SDK check: Sentry, Firebase, RevenueCat vs en son versiyonda mı? (Manifest en son versiyonlarda var.)
Bu 4 check temiz ise submission hazır.
Privacy Nutrition Labels ile ilişki
App Store’da kullanıcı app’inin privacy info’sunu görüyor (Nutrition Label). Manifest bu label’ları generate ediyor.
Privacy Manifest = source of truth
Nutrition Labels = user-facing representation
Eskiden manuel Nutrition Labels formunu doldururdun. Şimdi manifest’ten otomatik generate oluyor. Consistency artıyor.
Sonuç
Privacy Manifest iOS submission’ın zorunlu parçası. Dokümanı bir kez dikkatli okumak, Xcode’un GUI’siyle ilk manifest’i oluşturmak, SDK’ların en son versiyonlarına geçmek, submission öncesi validation almak.
Bir kez doğru kurulduğunda her release’de sadece 5-10 dakikalık manifest review yetiyor. İlk setup’ın acısı bir sonraki tüm release’lerde collect ediliyor.