Cara Melaksanakan PrivacyInfo.xcprivacy untuk Apl dan SDK iOS

opoinstall
2026-08-21
5 min read

Bagaimanakah cara melaksanakan PrivacyInfo.xcprivacy untuk apl iOS? Pelaksanaan PrivacyInfo.xcprivacy memerlukan penambahan manifes privasi yang sah pada sasaran apl atau SDK anda, pengisytiharan kod alasan yang diluluskan untuk sebarang API Alasan Diperlukan yang digunakan (seperti User Defaults atau System Boot Time), serta pengesahan bahawa kebergantungan pihak ketiga memenuhi keperluan manifes privasi dan tandatangan yang terpakai pada bentuk pengedaran mereka.

Manifes Privasi (PrivacyInfo.xcprivacy) ialah fail senarai hartanah piawai yang dibungkus dalam apl iOS dan SDK pihak ketiga yang mengisytiharkan kategori pengumpulan data, konfigurasi domain penjejakan, danjustifikasi yang diluluskan untuk mengakses API Alasan Diperlukan yang ditetapkan oleh Apple. Bermula 1 Mei 2024, apl yang dihantar ke App Store Connect mesti menyertakan alasan yang diluluskan untuk API Alasan Diperlukan yang digunakan oleh kod apl, termasuk kod SDK pihak ketiga yang berkenaan.

Terma Definisi
PrivacyInfo.xcprivacy Format senarai hartanah piawai Apple untuk mengisytiharkan amalan privasi apl dan SDK.
Required Reason APIs API platform khusus (seperti User Defaults atau Disk Space) yang memerlukan kod justifikasi eksplisit.
Resource Bundle Signing Kelakuan penandatanganan kod sistem binaan yang dikenakan pada sasaran berkas sumber yang dijana, yang mungkin memerlukan penyelesaian masalah dalam sesetengah konfigurasi Xcode dan CocoaPods.
Privacy Report Ringkasan PDF agregat yang dijana oleh Xcode 15+ yang menggabungkan pengisytiharan manifes privasi yang ditemui dalam apl yang diarkibkan dan SDK yang dipautkan.

Memahami Keperluan Manifes Privasi Apple untuk SDK iOS

Seni Bina Manifes Privasi: Manifes Aplikasi Utama vs Manifes SDK Terbenam

Rangka kerja manifes privasi Apple mewujudkan model ketelusan modular merentas rantaian bekalan perisian iOS. Daripada meminta aplikasi hos mengaudit dan mengisytiharkan butiran pelaksanaan dalaman bagi setiap pustaka yang diimport secara manual, Apple membahagikan tadbir urus privasi kepada lapisan yang berbeza:

  • Manifes Aplikasi Utama: Merangkumi pengumpulan data pihak pertama, domain penjejakan peringkat apl, dan API Alasan Diperlukan yang dipanggil secara langsung oleh kod sasaran aplikasi utama.
  • Manifes SDK Terbenam: Pengisytiharan API Alasan Diperlukan mesti dimiliki oleh kod apl atau SDK pihak ketiga yang menggunakan API tersebut. Untuk fail boleh laku dan pustaka dinamik, berkas yang mengandungi fail boleh laku atau pustaka tersebut mesti menyertakan manifes privasi yang berkaitan; SDK pihak ketiga tidak boleh bergantung pada manifes apl hos untuk melaporkan penggunaan API Alasan Diperlukan SDK itu.
  • Agregasi Kebergantungan Automatik: Apabila aplikasi diarkibkan dalam Xcode 15 atau lebih baharu, sistem binaan merentasi graf kebergantungan, menemui semua fail PrivacyInfo.xcprivacy yang dibungkus, dan menggabungkannya ke dalam satu Laporan Privasi yang bersatu.

PrivacyInfo xcprivacy app and SDK manifest architecture

Empat Kekunci Konfigurasi Akar

Setiap fail PrivacyInfo.xcprivacy berstruktur sebagai kamus senarai hartanah XML yang mengandungi sehingga empat kekunci peringkat akar:

  • NSPrivacyTracking (Boolean): Mengisytiharkan sama ada aplikasi atau SDK menggunakan data yang dikumpul daripada apl untuk penjejakan di bawah definisi Telus Penjejakan Apl (ATT) Apple.
  • NSPrivacyTrackingDomains (Susunan Rentetan): Senarai domain internet yang disambungkan oleh apl atau SDK yang terlibat dalam penjejakan. Jika pengguna tidak memberikan kebenaran ATT, iOS menyekat sambungan rangkaian ke domain yang diisytiharkan dalam susunan ini. Jika apl atau SDK tidak menyambung ke domain penjejakan, kekunci ini boleh ditinggalkan.
  • NSPrivacyCollectedDataTypes (Susunan Kamus): Melaporkan kategori data yang ditentukan Apple yang dikumpul oleh apl atau SDK tentang orang yang menggunakan apl tersebut, berserta sama ada data itu dipautkan kepada identiti pengguna, sama ada ia digunakan untuk penjejakan, dan tujuan operasi pengumpulannya.
  • NSPrivacyAccessedAPITypes (Susunan Kamus): Mengisytiharkan API Alasan Diperlukan yang ditetapkan oleh Apple yang dipanggil oleh binari, disertai dengan kod alasan rentetan yang diluluskan.

PrivacyInfo xcprivacy four root configuration keys

Penguatkuasaan Ingesti App Store Connect dan Diagnostik Ralat

App Store Connect menguatkuasakan manifes privasi semasa ingesti binari:

  • Isytihar API Hilang (ITMS-91053): Dicetuskan apabila binari yang disusun atau pustaka yang dipautkan memanggil simbol API Alasan Diperlukan, tetapi kekunci kategori yang sepadan tiada daripada NSPrivacyAccessedAPITypes.
  • Pengisytiharan Kod Alasan Tidak Sah: Berlaku apabila manifes mengisytiharkan rentetan alasan yang tidak diluluskan, berformat salah, atau telah ditamatkan untuk kategori API tertentu.
  • Manifes SDK Pihak Ketiga Diperlukan Tiada: Dikuatkuasakan dalam senario penyerahan yang ditentukan oleh keperluan SDK pihak ketiga semasa Apple untuk SDK tersenarai, memerlukan kedua-dua manifes privasi dan tandatangan digital yang sah untuk pengedaran binari.

Pembangun yang menyepadukan atribusi pelanggan dan pautan mendalam boleh merujuk kepada dokumentasi integrasi SDK iOS untuk spesifikasi teknikal mengenai pengisytiharan manifes.

Lihat Juga: SDK iOS ──> Seni Bina Atribusi Mudah Alih

Kategori API Alasan Diperlukan dan Kod Alasan yang Diluluskan

Lima Kategori API Alasan Diperlukan

Menurut Nota Teknikal Pembangun Apple TN3183, Apple mentakrifkan lima kategori API khusus yang memerlukan kod justifikasi eksplisit dalam NSPrivacyAccessedAPITypes. SDK mudah alih dan aplikasi iOS lazimnya berinteraksi dengan empat kategori utama:

  • NSPrivacyAccessedAPICategoryUserDefaults: Mengakses tetapan apl tempatan melalui UserDefaults atau NSUserDefaults.
  • NSPrivacyAccessedAPICategorySystemBootTime: Mengukur masa yang berlalu atau tanda masa menggunakan API but sistem seperti sysctl(KERN_BOOTTIME) atau systemUptime.
  • NSPrivacyAccessedAPICategoryDiskSpace: Memeriksa kapasiti sistem fail melalui statfs, statvfs, atau volumeAvailableCapacityKey.
  • NSPrivacyAccessedAPICategoryFileTimestamp: Memeriksa tarikh penciptaan atau pengubahsuaian fail melalui stat, getattrlist, atau contentModificationDateKey.
  • NSPrivacyAccessedAPICategoryActiveKeyboards: Memeriksa sambungan papan kekunci tersuai yang aktif (terutamanya digunakan oleh utiliti papan kekunci khusus).

Pemetaan Kod Alasan Diluluskan Terpilih untuk Kes Penggunaan SDK Biasa

Jadual di bawah menumpukan pada kategori yang biasa ditemui dalam SDK mudah alih tujuan am; rujuk dokumentasi semasa Apple untuk senarai alasan lengkap, termasuk Papan Kekunci Aktif. Untuk mematuhi garis panduan Apple, pembangun mesti memilih kod alasan yang sepadan dengan tepat dengan penggunaan data masa tayangan sebenar mereka:

Kekunci Kategori API Kod Diluluskan Tujuan Rasmi Selaras Apple
NSPrivacyAccessedAPICategoryUserDefaults CA92.1 Membaca dan menulis data yang boleh diakses hanya oleh apl itu sendiri
NSPrivacyAccessedAPICategoryUserDefaults 1C8F.1 Membaca dan menulis data yang dikongsi hanya di dalam Kumpulan Apl yang sama
NSPrivacyAccessedAPICategoryUserDefaults C56D.1 Pembalut SDK pihak ketiga yang menyediakan fungsi nilai kunci kepada apl hos
NSPrivacyAccessedAPICategorySystemBootTime 35F9.1 Mengukur masa yang berlalu antara peristiwa yang berlaku dalam apl atau mengendalikan pemasa
NSPrivacyAccessedAPICategorySystemBootTime 8FFB.1 Mengira tanda masa mutlak untuk peristiwa yang berlaku dalam apl
NSPrivacyAccessedAPICategoryDiskSpace E174.1 Memeriksa ruang cakera sebelum menulis fail dan mengubah suai kelakuan apl jika ruang rendah
NSPrivacyAccessedAPICategoryDiskSpace 85F4.1 Mengakses maklumat ruang cakera untuk memaparkan kapasiti yang tersedia kepada pengguna
NSPrivacyAccessedAPICategoryFileTimestamp C617.1 Mengakses metadata fail di dalam kontena apl, Kumpulan Apl, atau kontena CloudKit
NSPrivacyAccessedAPICategoryFileTimestamp 3B52.1 Mengakses metadata untuk fail atau direktori yang dipilih secara eksplisit oleh pengguna
NSPrivacyAccessedAPICategoryFileTimestamp 0A2A.1 Pembalut SDK pihak ketiga yang mengakses tanda masa fail semata-mata bagi pihak apl hos

Required Reason API categories and approved reason codes

Membina Contoh Senarai Hartanah PrivacyInfo.xcprivacy

Mengkonfigurasi Jenis Pengumpulan Data

Susunan NSPrivacyCollectedDataTypes melaporkan kategori data yang ditentukan Apple yang dikumpul oleh apl atau SDK tentang orang yang menggunakan apl tersebut, berserta sama ada data itu dipautkan kepada identiti pengguna, sama ada ia digunakan untuk penjejakan, dan tujuan operasi pengumpulannya:

  • NSPrivacyCollectedDataType: Pengecam rentetan standard Apple (cth., NSPrivacyCollectedDataTypeDeviceID).
  • NSPrivacyCollectedDataTypeLinked: Boolean yang menunjukkan sama ada data dipautkan kepada identiti pengguna individu.
  • NSPrivacyCollectedDataTypeTracking: Boolean yang menunjukkan sama ada data digunakan untuk penjejakan merentas apl.
  • NSPrivacyCollectedDataTypePurposes: Susunan rentetan tujuan standard (cth., NSPrivacyCollectedDataTypePurposeAnalytics).

Mengisytiharkan Domain Penjejakan

Jika SDK atau aplikasi terlibat dalam penjejakan di bawah definisi ATT, semua domain penjejakan yang sepadan mesti diisytiharkan di bawah NSPrivacyTrackingDomains. Jika kebenaran penjejakan tidak diberikan oleh pengguna, iOS menyekat sambungan rangkaian ke domain yang diisytiharkan. Jika apl atau SDK tidak terlibat dalam penjejakan, NSPrivacyTracking harus ditetapkan kepada false dan NSPrivacyTrackingDomains boleh ditinggalkan.

Konfigurasi senarai hartanah di bawah menggambarkan contoh skema PrivacyInfo.xcprivacy. Sertakan hanya kategori dan alasan yang mencerminkan pelaksanaan sebenar aplikasi anda:

```xml
<?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>NSPrivacyCollectedDataTypes</key>
    <array>
        <dict>
            <key>NSPrivacyCollectedDataType</key>
            <string>NSPrivacyCollectedDataTypeDeviceID</string>
            <key>NSPrivacyCollectedDataTypeLinked</key>
            <false/>
            <key>NSPrivacyCollectedDataTypeTracking</key>
            <false/>
            <key>NSPrivacyCollectedDataTypePurposes</key>
            <array>
                <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
                <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
            </array>
        </dict>
    </array>
    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategorySystemBootTime</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>35F9.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>E174.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

Menyelesaikan Ralat Penandatanganan Kod Berkas Sumber CocoaPods

Punca Utama: Kegagalan Penandatanganan Berkas Sumber dalam Xcode 15 dan 16

Apabila menyepadukan kebergantungan melalui CocoaPods dalam Xcode 15 atau 16, pembangun kerap menghadapi penghentian penyusunan:

Signing for "libOpoInstallSDK-OPPrivacy" requires a development team. Select a development team in the Signing & Capabilities editor.

Kegagalan binaan ini adalah isu integrasi Xcode dan CocoaPods:

  • Pustaka statik .a tradisional tidak boleh mengandungi sumber seperti PrivacyInfo.xcprivacy secara langsung. Apple mengesyorkan pembungkusan kod SDK statik dan sumber bersama-sama di dalam rangka kerja statik.
  • Sesetengah integrasi CocoaPods sebaliknya menjana sasaran berkas sumber yang berasingan untuk mengedarkan sumber bersama-sama pustaka statik.
  • Sasaran berkas sumber yang dijana oleh CocoaPods tertentu boleh mewarisi konfigurasi penandatanganan yang menyebabkan binaan Xcode berhenti dan meminta pasukan pembangunan. Ini adalah isu integrasi sistem binaan dan bukannya keperluan skema PrivacyInfo.xcprivacy.

Melaksanakan Penyelesaian Sistem Binaan Sasaran dalam Podfile

Untuk menyelesaikan ralat ini merentas binaan automatik, pembangun boleh menggunakan cangkuk post_install skop dalam Podfile projek mereka. Oleh kerana ini ialah penyelesaian sistem binaan untuk berkas sumber bukan boleh laku, pasukan harus mengehadkan skopnya kepada sasaran berkas terjejas tertentu atau mengesahkan kebergantungan terjejas sebelum mengenakan perubahan secara global.

Skrip Ruby di bawah menunjukkan cara lelaran melalui sasaran CocoaPods dan menyahaktifkan penandatanganan pada sasaran berkas sumber yang ditetapkan:

post_install do |installer|
  # Specify non-executable resource bundle targets that encounter signing errors without a development team
  target_bundle_names = [
    'libOpoInstallSDK-OPPrivacy'
  ]

  installer.pods_project.targets.each do |target|
    if target.respond_to?(:product_type) &&
       target.product_type == "com.apple.product-type.bundle" &&
       target_bundle_names.include?(target.name)
      target.build_configurations.each do |config|
        # Strip code signing requirement from designated non-executable resource bundles
        config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
        config.build_settings['CODE_SIGN_IDENTITY'] = ''
      end
    end
  end
end

Mengaudit dan Menjana Laporan Privasi Agregat dalam Xcode

Menjana Laporan Privasi Bersatu melalui Pengelola Arkib Xcode

Untuk mengesahkan bahawa semua sasaran pihak pertama dan kebergantungan pihak ketiga diisytiharkan dengan betul sebelum menyerahkan binari:

  1. Buka projek anda dalam Xcode 15 atau lebih baharu.
  2. Pilih Product > Archive untuk mencipta arkib keluaran.
  3. Dalam Pengelola Xcode, klik kanan (atau Ctrl-klik) arkib dan pilih Generate Privacy Report.
  4. Simpan dan periksa laporan PDF yang dijana untuk mengesahkan bahawa semua API Alasan Diperlukan, kategori data, dan manifes SDK pihak ketiga dipaparkan dengan tepat.

Analisis Statik Baris Perintah: Imbasan Heuristik Pra-Penyerahan

Pasukan pembangunan boleh melaksanakan audit pra-penyerahan heuristik di dalam saluran paip integrasi berterusan (CI/CD) dengan mengimbas binari yang disusun untuk simbol terhad menggunakan nm dan otool:

# Scan unpacked application binary for candidate Required Reason API symbols
nm -u /path/to/Payload/YourApp.app/YourApp | grep -E 'sysctl|statfs|statvfs|getattrlist|NSUserDefaults'

# Check embedded frameworks and bundles for PrivacyInfo.xcprivacy manifests
find /path/to/Payload/YourApp.app -name "PrivacyInfo.xcprivacy"

Kehadiran simbol sahaja tidak menetapkan alasan diluluskan yang mana terpakai; semak laluan panggilan sebenar dan kes penggunaan sebelum mengubah suai manifes. Pasukan mesti menggunakan Generate Privacy Report Xcode dan pra-pemeriksaan App Store Connect untuk pengesahan berwibawa.

iOS privacy manifest pre submission audit workflow

Matrik Diagnostik: Punca Utama Penolakan Manifes Privasi App Store

Mod Kegagalan / Kod Ralat Punca Utama Asas Kelakuan Sistem Diperhatikan Pemulihan Disyorkan
Isytihar API Hilang (ITMS-91053) Binari memanggil API terhad tetapi manifes meninggalkan kategori Amaran atau penolakan muat naik App Store Connect Isytiharkan kategori API yang sepadan dan kod alasan yang sah
Kod Alasan Tidak Sah Kod alasan yang ditentukan tidak diluluskan oleh Apple untuk kategori tersebut App Store Connect menolak penyerahan Kemas kini XML untuk menggunakan rentetan alasan yang diluluskan daripada spesifikasi Apple
Manifes SDK Pihak Ketiga Hilang Kebergantungan SDK pihak ketiga tersenarai tidak mempunyai manifes terbenam App Store Connect menandakan manifes SDK yang hilang Naik taraf kebergantungan kepada versi yang menyediakan PrivacyInfo.xcprivacy
Ralat Penandatanganan Kod Berkas Sumber CocoaPods menjana sasaran berkas sumber tanpa pasukan penandatanganan Penyusunan Xcode berhenti semasa binaan Nilai sasaran berkas yang gagal dan gunakan penyelesaian penandatanganan Podfile berskop
Titik Akhir Penjejakan Tidak Diisytiharkan Apl menyambung ke pelayan penjejakan yang tidak disenaraikan dalam NSPrivacyTrackingDomains Konfigurasi privasi tidak lengkap untuk kelakuan penjejakan apl Senaraikan semua titik akhir penjejakan di bawah NSPrivacyTrackingDomains

Soalan Lazim (FAQ)

Adakah setiap SDK pihak ketiga memerlukan fail PrivacyInfo.xcprivacy sendiri?
Bukan semata-mata kerana ia adalah pustaka pihak ketiga. SDK yang menggunakan API Alasan Diperlukan mesti melaporkan penggunaan tersebut dalam manifes privasinya sendiri, dan SDK yang mengumpul data harus menerangkan pengumpulan itu dalam manifes mereka sendiri. Di samping itu, Apple memerlukan manifes privasi untuk SDK tersenarai dalam senario penyerahan yang diterangkan dalam keperluan SDK pihak ketiga semasa, dengan tandatangan diperlukan tambahan apabila SDK tersenarai tersebut digunakan sebagai kebergantungan binari. Aplikasi hos tidak boleh mengisytiharkan API Alasan Diperlukan bagi pihak SDK terbenam.
Apakah yang berlaku jika apl menggunakan UserDefaults tanpa mengisytiharkan alasan yang diluluskan?
Jika binari apl atau SDK yang dipautkan memanggil API `UserDefaults` tanpa mengisytiharkan `NSPrivacyAccessedAPICategoryUserDefaults` dengan kod alasan yang sah (seperti `CA92.1` untuk data dalaman apl atau `1C8F.1` untuk Kumpulan Apl), App Store Connect akan menandakan binari dengan ralat `ITMS-91053` atau menyekat penyerahan. Kod alasan yang betul bergantung pada penggunaan data masa tayangan sebenar.
Bolehkah aplikasi mengisytiharkan berbilang alasan untuk satu kategori API?
Ya. Kekunci `NSPrivacyAccessedAPITypeReasons` menerima susunan rentetan. Jika aplikasi atau SDK menggunakan API untuk berbilang tujuan diluluskan yang berbeza (cth., memeriksa ruang cakera yang mencukupi untuk mengubah suai kelakuan apl melalui `E174.1` dan juga memaparkan ruang cakera yang tersedia kepada pengguna melalui `85F4.1`), kedua-dua kod alasan yang diluluskan boleh diisytiharkan di dalam susunan tersebut.

Ringkasan dan Rangka Kerja Keputusan

Rangka kerja Manifes Privasi Apple menguatkuasakan ketelusan merentas rantaian bekalan perisian iOS. Memastikan penyerahan App Store yang lancar memerlukan pasukan pembangunan mengaudit kod pihak pertama untuk penggunaan API Alasan Diperlukan, mengesahkan bahawa kebergantungan SDK pihak ketiga memenuhi keperluan manifes privasi yang terpakai pada penggunaan API mereka, dan mengurus penandatanganan berkas sumber CocoaPods dengan sewajarnya.

Untuk pengisytiharan manifes privasi khusus produk, semak dokumentasi OpoInstall dan bandingkan manifes yang dihantar dengan integrasi sebenar aplikasi serta keperluan semasa Apple.

Bahan Berkaitan

  • Konsep: Manifes Privasi, API Alasan Diperlukan, Penandatanganan Kod Berkas Sumber, Laporan Privasi, Pematuhan App Store

  • Teknologi: Xcode 15+, Pengurus Kebergantungan CocoaPods, Pengurus Pakej Swift, SDK iOS OpoInstall

  • Piawaian: Spesifikasi Manifes Privasi Apple, Garis Panduan Semakan App Store Seksyen 5.1.1

  • API & Konfigurasi: PrivacyInfo.xcprivacy, NSPrivacyAccessedAPITypes, Cangkuk `post_install` Podfile

Dokumentasi Rasmi

Share this article