Privacy Manifest (PrivacyInfo.xcprivacy) — file yang semua aplikasi dan SDK pihak ketiga wajib sertakan dalam build iOS mulai musim semi 2024. Apple mewajibkan deklarasi alasan penggunaan API yang dilindungi (Required Reason API) dan tipe data yang dikumpulkan. Menurut Apple Developer Documentation, setiap biner dalam komposisi aplikasi — target utama, framework, dependensi Swift Package Manager — harus berisi Privacy Manifest sendiri.
Poin Utama
Privacy Manifest adalah file PrivacyInfo.xcprivacy dalam format property list (XML), yang mendeklarasikan jenis data apa yang dikumpulkan aplikasi dan mengapa menggunakan API tertentu. Apple memperkenalkan manifest sebagai bagian dari inisiatif transparansi privasi, mirip dengan Privacy Nutrition Label, tetapi pada tingkat kode dan biner.
Tujuan utama manifest adalah mendokumentasikan penggunaan yang disebut Required Reason API. Ini adalah kategori API yang dapat digunakan untuk mengambil sidik jari digital perangkat (fingerprinting), oleh karena itu setiap penggunaannya harus disertai dengan deklarasi alasan spesifik dari daftar yang disetujui Apple.
Mulai 1 Mei 2024, Apple menolak build yang tidak menyertakan Privacy Manifest. Ini berlaku baik untuk target utama aplikasi maupun semua SDK dan dependensi bawaan. Menurut WWDC 2023, manifest wajib untuk semua aplikasi yang didistribusikan melalui App Store.
Manifest harus ada di setiap biner — tidak hanya di aplikasi utama, tetapi juga di setiap framework dan pustaka statis. Jika SDK pihak ketiga tidak menyediakan manifest, pengembang harus menambahkannya secara manual atau menghubungi penyedia SDK untuk pembaruan.
Sebelum munculnya manifest, pengembang dapat menggunakan API sistem yang ekstensif (akses ke sistem file, tanggal/waktu, log sistem) tanpa penjelasan transparan tentang tujuan penggunaan. Ini menciptakan risiko kebocoran data melalui SDK pihak ketiga yang dapat mengumpulkan informasi tanpa sepengetahuan pengembang.
Menurut data Mysk Inc. (2023), banyak SDK populer menggunakan API untuk mengambil sidik jari perangkat tanpa kebutuhan yang jelas — misalnya, membaca waktu uptime untuk menentukan zona waktu atau memindai direktori untuk mengumpulkan metadata. Privacy Manifest mewajibkan deklarasi setiap tindakan tersebut.
Selain Required Reason API, manifest menyertakan bagian NSPrivacyTracking — bendera yang menunjukkan apakah aplikasi menggunakan pelacakan (memerlukan ATT) dan NSPrivacyCollectedDataTypes — daftar tipe data yang dikumpulkan dalam format Privacy Nutrition Label.
Privacy Nutrition Label adalah tampilan ramah pengguna di halaman aplikasi di App Store, yang menunjukkan data apa yang dikumpulkan aplikasi. Privacy Manifest adalah file teknis di dalam biner yang diperiksa secara otomatis oleh Apple. Jika data dalam manifest tidak sesuai dengan label di App Store Connect, Apple menolak build.
Dengan demikian, manifest adalah sumber kebenaran untuk sistem pemeriksaan Apple. Berdasarkan itu, label privasi dibuat secara otomatis, tetapi pengembang harus menjaga kedua representasi tetap mutakhir. Mengubah manifest setelah publikasi memerlukan pengiriman build baru untuk ditinjau.
File PrivacyInfo.xcprivacy menggunakan format property list dengan tipe akar Dictionary. Kunci utama tingkat atas: NSPrivacyTracking (Boolean), NSPrivacyTrackingDomains (Array), NSPrivacyCollectedDataTypes (Array), NSPrivacyAccessedAPITypes (Array).
Kunci NSPrivacyTracking — nilai boolean yang menunjukkan apakah aplikasi menggunakan pelacakan (memerlukan ATT). Jika true, NSUserTrackingUsageDescription juga harus ditentukan di Info.plist. Kunci NSPrivacyTrackingDomains — array domain tempat pelacakan diterapkan.
Kunci NSPrivacyCollectedDataTypes — array kamus, yang masing-masing menjelaskan jenis data yang dikumpulkan: kategori (NSPrivacyCollectedDataType), kewajiban (NSPrivacyCollectedDataTypeLinked), tujuan (NSPrivacyCollectedDataTypePurposes). Tujuan meliputi: penandaan pihak ketiga, analitik, pengembangan produk, dan personalisasi konten.
Kunci NSPrivacyAccessedAPITypes — array kamus untuk setiap kategori Required Reason API: kategori (NSPrivacyAccessedAPITypeReasons) — alasan spesifik dari daftar yang disetujui Apple dan NSPrivacyAccessedAPIType — pengidentifikasi kategori API.
<!-- 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>
Tipe data dibagi menjadi beberapa kategori: informasi kontak (nama, email, telepon), keuangan (data pembayaran), pengidentifikasi (IDFA, User ID), data penggunaan (log, klik), diagnostik (crash logs) dan konten pengguna (foto, video, file). Setiap kategori tambahan ditandai sebagai „terkait dengan pengguna" (linked) atau „tidak terkait" (not linked).
Linked berarti data terkait dengan akun pengguna; not linked — data digabungkan atau dianonimkan. Dari penandaan ini tergantung bagaimana Apple menampilkan label privasi: data linked ditandai kuning, not linked — hijau.
Apple telah mengidentifikasi beberapa kategori API, yang setiap penggunaannya harus disertai dengan alasan spesifik dari daftar yang disetujui. Alasan adalah kode unik, misalnya C617.1 atau 35F9.1, yang sesuai dengan tujuan spesifik yang diizinkan Apple.
Kategori NSPrivacyAccessedAPICategoryFileTimestamp mencakup API untuk akses ke stempel waktu file (creationDate, modificationDate). Alasan: C617.1 (sinkronisasi file), 3B52.1 (cadangan), 0A2A.1 (anti-penipuan).
Kategori NSPrivacyAccessedAPICategoryDiskSpace mencakup API untuk memeriksa ruang kosong disk (NSFileManager. Pemeriksaan (NSFileManager). Alasan: E174.1 (manajemen cache), 85F4.1 (unduh konten), B728.1 (diagnostik).
Kategori NSPrivacyAccessedAPICategorySystemBootTime mencakup API akses ke waktu boot sistem (uptime). Hanya ada satu alasan: 35F9.1 (pengukuran waktu sesi untuk analitik). Penggunaan lainnya dianggap sebagai fingerprinting.
Setiap kategori memiliki 1 hingga 5 alasan yang disetujui. Pengembang wajib memilih alasan yang paling sesuai dengan penggunaan API yang sebenarnya. Memberikan alasan yang tidak benar dapat menyebabkan penolakan build atau pemblokiran akun.
Mulai 1 Mei 2024, semua SDK pihak ketiga — baik biner maupun sumber terbuka — wajib menyertakan Privacy Manifest dalam paket mereka. Apple memeriksa manifest untuk semua dependensi, dan jika setidaknya satu SDK tidak memiliki manifest, build akan ditolak.
SDK besar (Firebase, Adjust, AppsFlyer, Facebook SDK) sudah memperbarui paket mereka. Jika proyek Anda menggunakan SDK yang kurang dikenal, periksa versinya dan jika perlu perbarui atau hubungi pengembang. Solusi sementara — menambahkan manifest untuk SDK secara manual ke proyek, tetapi tidak disarankan karena ketidaksesuaian saat pembaruan.
Privacy Info.xcprivacy dapat dibuat melalui template bawaan Xcode 15+ atau secara manual. Mari kita bahas kedua opsi.
Di Xcode 15 telah ditambahkan template Privacy Manifest: File → New → File → Resource → Privacy Manifest. Xcode membuat file dengan struktur dasar dan mengisi NSPrivacyTracking serta array kosong untuk API dan data. Setelah dibuat, Anda perlu secara manual menentukan alasan untuk setiap Required Reason API yang digunakan.
Template secara otomatis menambahkan file ke target utama. Jika proyek memiliki beberapa target (Extensions, Watch app), manifest harus ditambahkan ke masing-masing. Xcode tidak memeriksa keberadaan manifest dalam dependensi pada tahap kompilasi — hanya pada tahap pengarsipan.
// AppDelegate: memeriksa manifest pada tahap pengembangan
import Foundation
func validatePrivacyManifest() {
guard let path = Bundle.main.path(
forResource: "PrivacyInfo", ofType: "xcprivacy"
) else {
print("PrivacyInfo.xcprivacy not found")
return
}
guard let dict = NSDictionary(contentsOfFile: path)
else { return }
print("Privacy manifest loaded: \(dict.count) keys")
}
Anda dapat membuat PrivacyInfo.xcprivacy secara manual sebagai file XML property list biasa. Untuk ini, buat file dengan nama PrivacyInfo.xcprivacy, tulis header plist standar dan tambahkan kamus akar dengan kunci yang diperlukan. Pastikan file telah ditambahkan ke target (Target Membership).
Cara manual berguna ketika Anda perlu menambahkan manifest ke pustaka statis atau dependensi Package Manager tanpa menggunakan antarmuka Xcode. Setelah kompilasi, periksa apakah file telah masuk ke biner melalui perintah nm atau pengarsipan.
Sebelum mengirim build ke App Store, Anda perlu memeriksa apakah Privacy Manifest benar dan lengkap. Apple menyediakan beberapa alat pemeriksaan.
Saat pengarsipan proyek (Product → Archive) Xcode melakukan pemeriksaan manifest. Jika ditemukan kesalahan — tidak ada manifest, alasan salah, kategori kosong — pengarsipan berakhir dengan kesalahan. Log kesalahan ditampilkan di Issue navigator dengan menunjukkan SDK bermasalah dan kategori API.
Pemeriksaan tambahan dilakukan oleh App Store Connect saat mengunggah build. Jika validasi gagal, build ditolak dengan email otomatis yang berisi pengidentifikasi API bermasalah dan perbaikan yang direkomendasikan.
Untuk otomatisasi pemeriksaan, gunakan skrip yang menganalisis biner untuk penggunaan Required Reason API. Apple menyediakan alat libtool dan skrip pemeriksaan simbol, tetapi komunitas telah mengembangkan utilitas yang lebih nyaman.
# Mencari penggunaan FileTimestamp API di biner
nm MyApp.app/MyApp | grep "NSFileCreationDate"
# Memeriksa keberadaan PrivacyInfo.xcprivacy di aplikasi
find MyApp.app -name "*.xcprivacy"
Kesalahan paling umum — tidak adanya manifest di salah satu SDK. Bahkan jika target utama berisi manifest, Apple memeriksa semua biner secara terpisah. Yang kedua paling umum — kode alasan yang salah: menggunakan alasan untuk satu kategori API dengan API dari kategori lain.
Kesalahan ketiga — deklarasi berlebihan API yang sebenarnya tidak digunakan. Pengembang menambahkan semua kemungkinan alasan "untuk jaga-jaga", yang mengkhawatirkan peninjau Apple. Tambahkan hanya kategori yang benar-benar digunakan. Gunakan penganalisis statis Xcode untuk pemeriksaan.
Pertanyaan yang Sering Diajukan
Mulai 1 Mei 2024, Apple menolak build apa pun tanpa manifest. Kesalahan terjadi pada tahap unggah ke App Store Connect. Aplikasi lama tidak diblokir, tetapi pembaruan memerlukan penyertaan wajib manifest.
Ya, manifest wajib untuk semua platform Apple: iOS, iPadOS, macOS, tvOS, watchOS dan visionOS. Persyaratan untuk Required Reason API seragam untuk semua platform, meskipun set API mungkin sedikit berbeda.
Jika SDK tidak menyediakan manifest, buat file PrivacyInfo.xcprivacy terpisah dan tambahkan ke grup SDK di proyek. Tentukan alasan untuk API yang digunakan SDK ini berdasarkan dokumentasi SDK.
Ya. Pada pemeriksaan otomatis, Apple membandingkan alasan yang dideklarasikan dengan panggilan API yang sebenarnya. Ketidaksesuaian menyebabkan penolakan. Pada pemeriksaan manual, peninjau dapat meminta penjelasan.
Ya, Apple memeriksa manifest untuk semua dependensi, termasuk SPM. Penyedia paket wajib menyertakan PrivacyInfo.xcprivacy di repositori mereka. Xcode memperingatkan tentang manifest yang hilang saat pengarsipan.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga