Privacy Manifest (PrivacyInfo.xcprivacy), 2024 baharından itibaren tüm uygulamaların ve üçüncü taraf SDK'ların iOS derlemesine dahil etmesi gereken bir dosyadır. Apple, korunan API'lerin (Required Reason API) kullanım nedenlerini ve toplanan veri türlerini beyan etmeyi gerektirir. Apple Geliştirici Belgeleri'ne göre, uygulama içindeki her ikili dosya — ana hedef, framework'ler, Swift Package Manager bağımlılıkları — kendi Privacy Manifest'ini içermelidir.
Ana Hatlar
Privacy Manifest, property list (XML) biçiminde bir PrivacyInfo.xcprivacy dosyasıdır ve uygulamanın hangi tür verileri topladığını ve belirli API'leri neden kullandığını beyan eder. Apple, gizlilik şeffaflığını artırma girişiminin bir parçası olarak, Privacy Nutrition Label'a benzer şekilde ancak kod ve ikili dosya düzeyinde bildirimler sunmuştur.
Bildirimin temel amacı, sözde Required Reason API'lerinin kullanımını belgelemektir. Bunlar, cihazın dijital parmak izi alınması (fingerprinting) için kullanılabilecek API kategorileridir, bu nedenle her kullanım Apple'ın onaylı listesinden belirli bir nedenin beyanıyla birlikte olmalıdır.
1 Mayıs 2024'ten itibaren Apple, Privacy Manifest içermeyen derlemeleri reddeder. Bu, uygulamanın ana hedefleri ve tüm gömülü SDK'lar ve bağımlılıklar için geçerlidir. WWDC 2023'e göre, App Store aracılığıyla dağıtılan tüm uygulamalar için bildirim zorunludur.
Bildirim her ikili dosyada bulunmalıdır — yalnızca ana uygulamada değil, her framework ve statik kitaplıkta da. Üçüncü taraf bir SDK bildirim sağlamadıysa, geliştiricinin manuel olarak eklemesi veya güncelleme için SDK sağlayıcısıyla iletişime geçmesi gerekir.
Bildirimlerden önce, geliştiriciler şeffaf bir açıklama olmadan kapsamlı sistem API'lerini (dosya sistemi erişimi, tarih/saat, sistem günlükleri) kullanabiliyordu. Bu, geliştiricinin bilgisi olmadan bilgi toplayabilen üçüncü taraf SDK'lar aracılığıyla veri sızıntısı riski oluşturuyordu.
Mysk Inc. (2023)'e göre, birçok popüler SDK, açık bir gereklilik olmadan cihaz parmak izi almak için API'ler kullanıyordu — örneğin, saat dilimini belirlemek için çalışma süresini okumak veya meta veri toplamak için dizinleri taramak. Privacy Manifest bu tür her eylemi beyan etmeyi zorunlu kılar.
Required Reason API'nin yanı sıra, bildirim NSPrivacyTracking bölümünü — uygulamanın izleme kullanıp kullanmadığını gösteren bir işaret (ATT gerektirir) ve NSPrivacyCollectedDataTypes — Privacy Nutrition Label biçiminde toplanan veri türlerinin bir listesini içerir.
Privacy Nutrition Label, App Store'daki uygulama sayfasında kullanıcıya yönelik bir gösterimdir ve uygulamanın hangi verileri topladığını gösterir. Privacy Manifest, ikili dosyanın içindeki teknik bir dosyadır ve Apple tarafından otomatik olarak kontrol edilir. Bildirimdeki veriler App Store Connect'teki etiketlerle eşleşmezse, Apple derlemeyi reddeder.
Bu nedenle bildirim, Apple'ın doğrulama sistemi için gerçeğin kaynağıdır. Gizlilik etiketleri bundan otomatik olarak oluşturulur, ancak geliştirici her iki gösterimi de güncel tutmalıdır. Yayınlandıktan sonra bildirimi değiştirmek, inceleme için yeni bir derleme gönderilmesini gerektirir.
PrivacyInfo.xcprivacy dosyası, kök türü Dictionary olan property list biçimini kullanır. Ana üst düzey anahtarlar şunlardır: NSPrivacyTracking (Boolean), NSPrivacyTrackingDomains (Array), NSPrivacyCollectedDataTypes (Array), NSPrivacyAccessedAPITypes (Array).
NSPrivacyTracking anahtarı — uygulamanın izleme uygulayıp uygulamadığını gösteren bir boolean değer (ATT gerektirir). True ise, Info.plist'te NSUserTrackingUsageDescription da belirtilmelidir. NSPrivacyTrackingDomains anahtarı — izlemenin uygulandığı alan adları dizisi.
NSPrivacyCollectedDataTypes anahtarı — her biri toplanan veri türünü tanımlayan sözlükler dizisi: kategori (NSPrivacyCollectedDataType), bağlantı (NSPrivacyCollectedDataLinked), amaç (NSPrivacyCollectedDataTypePurposes). Amaçlar şunları içerir: üçüncü taraf reklamcılığı, analitik, ürün geliştirme ve içerik kişiselleştirme.
NSPrivacyAccessedAPITypes anahtarı — her Required Reason API kategorisi için sözlükler dizisi: kategori (NSPrivacyAccessedAPITypeReasons) — Apple'ın onaylı listesinden belirli bir neden ve NSPrivacyAccessedAPIType — API kategori tanımlayıcısı.
<!-- PrivacyInfo.xcprivacy -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
Veri türleri birkaç kategoriye ayrılır: iletişim bilgileri (ad, e-posta, telefon), finans (ödeme verileri), tanımlayıcılar (IDFA, kullanıcı kimliği), kullanım verileri (günlükler, tıklamalar), tanılama (çökme günlükleri) ve kullanıcı içeriği (fotoğraflar, videolar, dosyalar). Her kategori ayrıca "kullanıcıyla bağlantılı" veya "bağlantılı değil" olarak işaretlenir.
Bağlantılı, verilerin kullanıcı hesabına bağlı olduğu anlamına gelir; bağlantılı değil, verilerin toplandığı veya anonimleştirildiği anlamına gelir. Bu işaretleme, Apple'ın gizlilik etiketini görüntüleme şeklini etkiler: bağlantılı veriler sarı, bağlantılı olmayanlar yeşil olarak işaretlenir.
Apple, her birinin kullanımı onaylı listeden belirli bir nedenle birlikte olması gereken birkaç API kategorisi belirlemiştir. Neden, Apple tarafından izin verilen belirli bir amaca karşılık gelen benzersiz bir koddur, örneğin C617.1 veya 35F9.1.
NSPrivacyAccessedAPICategoryFileTimestamp kategorisi, dosya zaman damgalarına (creationDate, modificationDate) erişmek için API'leri içerir. Nedenler: C617.1 (dosya senkronizasyonu), 3B52.1 (yedekleme), 0A2A.1 (dolandırıcılık önleme).
NSPrivacyAccessedAPICategoryDiskSpace kategorisi, diskteki boş alanı kontrol etmek için API'leri içerir (NSFileManager. Kontroller (NSFileManager). Nedenler: E174.1 (önbellek yönetimi), 85F4.1 (içerik indirme), B728.1 (tanılama).
NSPrivacyAccessedAPICategorySystemBootTime kategorisi, sistem başlatma süresine (çalışma süresi) erişmek için API'leri içerir. Yalnızca bir neden: 35F9.1 (analitik için oturum süresi ölçümü). Diğer herhangi bir kullanım parmak izi olarak kabul edilir.
Her kategorinin 1 ila 5 onaylı nedeni vardır. Geliştirici, API'nin gerçek kullanımına en doğru şekilde karşılık gelen nedeni seçmelidir. Yanlış bir neden sağlamak, derlemenin reddedilmesine veya hesabın askıya alınmasına yol açabilir.
1 Mayıs 2024'ten itibaren, tüm üçüncü taraf SDK'lar — hem ikili hem de açık kaynak — paketlerine bir Privacy Manifest eklemek zorundadır. Apple tüm bağımlılıkların bildirimlerini kontrol eder ve en az bir SDK'da bildirim yoksa derleme reddedilir.
Büyük SDK'lar (Firebase, Adjust, AppsFlyer, Facebook SDK) paketlerini zaten güncellemiştir. Projeniz az bilinen bir SDK kullanıyorsa, sürümünü kontrol edin ve gerekirse güncelleyin veya geliştiriciyle iletişime geçin. Geçici bir çözüm, projede SDK için manuel olarak bir bildirim eklemektir, ancak güncellemeler sırasında tutarsızlıklar nedeniyle önerilmez.
PrivacyInfo.xcprivacy'yi Xcode 15+'daki yerleşik şablon aracılığıyla veya manuel olarak oluşturabilirsiniz. Her iki seçeneği de inceleyelim.
Xcode 15, bir Privacy Manifest şablonu içerir: File → New → File → Resource → Privacy Manifest. Xcode, temel yapıya sahip bir dosya oluşturur ve NSPrivacyTracking ile API ve veriler için boş dizileri doldurur. Oluşturduktan sonra, kullanılan her Required Reason API için nedenleri manuel olarak belirtmeniz gerekir.
Şablon, dosyayı otomatik olarak ana hedefe ekler. Projenin birden çok hedefi varsa (Extensions, Watch app), bildirimi her birine eklemeniz gerekir. Xcode, derleme zamanında bağımlılıklarda bildirimin varlığını kontrol etmez — yalnızca arşivleme aşamasında kontrol eder.
// AppDelegate: geliştirme aşamasında bildirim kontrolü
import Foundation
func validatePrivacyManifest() {
guard let path = Bundle.main.path(
forResource: "PrivacyInfo", ofType: "xcprivacy"
) else {
print("PrivacyInfo.xcprivacy bulunamadı")
return
}
guard let dict = NSDictionary(contentsOfFile: path)
else { return }
print("Privacy manifest loaded: \(dict.count) keys")
}
PrivacyInfo.xcprivacy'yi normal bir XML property list dosyası olarak manuel olarak oluşturabilirsiniz. Bunu yapmak için PrivacyInfo.xcprivacy adında bir dosya oluşturun, standart plist başlığını yazın ve gerekli anahtarlarla bir kök sözlük ekleyin. Dosyanın hedefe eklendiğinden emin olun (Target Membership).
Manuel yöntem, Xcode arayüzünü kullanmadan statik bir kitaplığa veya Package Manager bağımlılığına bildirim eklemeniz gerektiğinde kullanışlıdır. Derlemeden sonra, nm komutunu veya arşivlemeyi kullanarak dosyanın ikili dosyaya dahil edildiğini doğrulayın.
Derlemeyi App Store'a göndermeden önce, Privacy Manifest'in doğru ve eksiksiz olduğunu doğrulamanız gerekir. Apple birkaç doğrulama aracı sağlar.
Bir projeyi arşivlerken (Product → Archive), Xcode bildirim doğrulaması gerçekleştirir. Bir hata bulunursa — eksik bildirim, yanlış neden, boş kategori — arşivleme bir hatayla başarısız olur. Hata günlüğü, sorunlu SDK ve API kategorisini belirten Issue navigator'da görüntülenir.
Derleme yüklenirken App Store Connect tarafında ek doğrulama gerçekleştirilir. Doğrulama başarısız olursa, derleme, sorunlu API'nin tanımlayıcısını ve önerilen düzeltmeyi içeren otomatik bir e-postayla reddedilir.
Doğrulamayı otomatikleştirmek için, Required Reason API kullanımı açısından ikili dosyayı analiz eden komut dosyaları kullanın. Apple, libtool aracını ve sembol doğrulama komut dosyalarını sağlar, ancak topluluk daha kullanışlı yardımcı programlar geliştirmiştir.
# İkili dosyada FileTimestamp API kullanımının aranması
nm MyApp.app/MyApp | grep "NSFileCreationDate"
# Uygulamada PrivacyInfo.xcprivacy varlığının kontrolü
find MyApp.app -name "*.xcprivacy"
En yaygın hata, SDK'lardan birinde bildirimin bulunmamasıdır. Ana hedef bir bildirim içerse bile, Apple her ikili dosyayı ayrı ayrı kontrol eder. İkinci en yaygın hata, yanlış neden kodudur — bir API kategorisi için bir nedenin başka bir kategorideki API ile kullanılması.
Üçüncü hata, gerçekte kullanılmayan API'lerin aşırı beyanıdır. Geliştiriciler "her ihtimale karşı" tüm olası nedenleri ekler, bu da Apple incelemecilerini şüphelendirir. Yalnızca gerçekten kullanılan kategorileri ekleyin. Doğrulama için Xcode statik analizörünü kullanın.
Sıkça sorulan sorular
1 Mayıs 2024'ten itibaren Apple, bildirimsiz herhangi bir derlemeyi reddeder. Hata, App Store Connect'e yükleme aşamasında oluşur. Eski uygulamalar engellenmez, ancak güncellemeler bildirimin zorunlu olarak dahil edilmesini gerektirir.
Evet, bildirim tüm Apple platformları için zorunludur: iOS, iPadOS, macOS, tvOS, watchOS ve visionOS. Required Reason API gereksinimleri tüm platformlarda aynıdır, ancak API kümeleri biraz farklılık gösterebilir.
SDK bir bildirim sağlamadıysa, ayrı bir PrivacyInfo.xcprivacy dosyası oluşturun ve projede SDK grubuna ekleyin. SDK'nın belgelerine dayanarak bu SDK tarafından kullanılan API'ler için nedenler belirtin.
Evet. Otomatik kontrol sırasında Apple, beyan edilen nedenleri gerçek API çağrılarıyla karşılaştırır. Uyuşmazlık reddedilmeye yol açar. Manuel inceleme sırasında, inceleyici açıklama isteyebilir.
Evet, Apple SPM dahil tüm bağımlılıklar için bildirimleri kontrol eder. Paket sağlayıcıları, depolarına PrivacyInfo.xcprivacy eklemek zorundadır. Xcode, arşivleme sırasında eksik bildirimler hakkında uyarır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun