Privacy Manifest (PrivacyInfo.xcprivacy) — το αρχείο που όλες οι εφαρμογές και τα SDK τρίτων υποχρεούνται να συμπεριλαμβάνουν στην έκδοση iOS από την άνοιξη του 2024. Η Apple απαιτεί τη δήλωση των λόγων χρήσης προστατευμένων API (Required Reason API) και των τύπων συλλεγόμενων δεδομένων. Σύμφωνα με την Apple Developer Documentation, κάθε δυαδικό στη σύνθεση της εφαρμογής — κύριος στόχος, πλαίσια, εξαρτήσεις Swift Package Manager — πρέπει να περιέχει το δικό του Privacy Manifest.
Κύρια σημεία
Το Privacy Manifest είναι το αρχείο PrivacyInfo.xcprivacy σε μορφή property list (XML), το οποίο δηλώνει ποιους τύπους δεδομένων συλλέγει η εφαρμογή και γιατί χρησιμοποιεί συγκεκριμένα API. Η Apple εισήγαγε τα manifest στο πλαίσιο της πρωτοβουλίας για αύξηση της διαφάνειας απορρήτου, παρόμοια με το Privacy Nutrition Label, αλλά σε επίπεδο κώδικα και δυαδικού.
Ο κύριος σκοπός του manifest είναι η τεκμηρίωση της χρήσης των λεγόμενων Required Reason API. Αυτές είναι κατηγορίες API που μπορούν να χρησιμοποιηθούν για λήψη ψηφιακού αποτυπώματος της συσκευής (fingerprinting), επομένως κάθε χρήση τους πρέπει να συνοδεύεται από δήλωση συγκεκριμένου λόγου από την εγκεκριμένη λίστα της Apple.
Από 1 Μαΐου 2024, η Apple απορρίπτει εκδόσεις που δεν περιέχουν Privacy Manifest. Αυτό ισχύει τόσο για τους κύριους στόχους της εφαρμογής όσο και για όλα τα ενσωματωμένα SDK και εξαρτήσεις. Σύμφωνα με το WWDC 2023, το manifest είναι υποχρεωτικό για όλες τις εφαρμογές που διανέμονται μέσω του App Store.
Το manifest πρέπει να υπάρχει σε κάθε δυαδικό — όχι μόνο στην κύρια εφαρμογή, αλλά και σε κάθε πλαίσιο και στατική βιβλιοθήκη. Εάν ένα SDK τρίτου δεν παρέχει manifest, ο προγραμματιστής πρέπει να το προσθέσει χειροκίνητα ή να επικοινωνήσει με τον πάροχο SDK για ενημέρωση.
Πριν από την εμφάνιση των manifest, οι προγραμματιστές μπορούσαν να χρησιμοποιούν εκτεταμένα συστημικά API (πρόσβαση στο σύστημα αρχείων, ημερομηνία/ώρα, αρχεία καταγραφής συστήματος) χωρίς διαφανή εξήγηση του σκοπού χρήσης. Αυτό δημιουργούσε κίνδυνο διαρροής δεδομένων μέσω SDK τρίτων που μπορούσαν να συλλέγουν πληροφορίες εν αγνοία του προγραμματιστή.
Σύμφωνα με δεδομένα της Mysk Inc. (2023), πολλά δημοφιλή SDK χρησιμοποιούσαν API για λήψη αποτυπώματος συσκευής χωρίς προφανή ανάγκη — για παράδειγμα, διάβαζαν τον χρόνο uptime για τον προσδιορισμό ζώνης ώρας ή σάρωναν καταλόγους για συλλογή μεταδεδομένων. Το Privacy Manifest υποχρεώνει σε δήλωση κάθε τέτοιας ενέργειας.
Εκτός από τα Required Reason API, το manifest περιλαμβάνει την ενότητα NSPrivacyTracking — μια σημαία που υποδεικνύει εάν η εφαρμογή χρησιμοποιεί παρακολούθηση (απαιτεί ATT) και NSPrivacyCollectedDataTypes — λίστα τύπων συλλεγόμενων δεδομένων σε μορφή Privacy Nutrition Label.
Το Privacy Nutrition Label είναι μια φιλική προς τον χρήστη προβολή στη σελίδα της εφαρμογής στο App Store, που δείχνει ποια δεδομένα συλλέγει η εφαρμογή. Το Privacy Manifest είναι ένα τεχνικό αρχείο μέσα στο δυαδικό που ελέγχεται αυτόματα από την Apple. Εάν τα δεδομένα στο manifest δεν συμπίπτουν με τις ετικέτες στο App Store Connect, η Apple απορρίπτει την έκδοση.
Έτσι, το manifest είναι η πηγή αλήθειας για το σύστημα ελέγχου της Apple. Βάσει αυτού δημιουργούνται αυτόματα οι ετικέτες απορρήτου, αλλά ο προγραμματιστής πρέπει να διατηρεί και τις δύο αναπαραστάσεις ενημερωμένες. Η αλλαγή του manifest μετά τη δημοσίευση απαιτεί αποστολή νέας έκδοσης για έλεγχο.
Το αρχείο PrivacyInfo.xcprivacy χρησιμοποιεί τη μορφή property list με ριζικό τύπο Dictionary. Τα κύρια κλειδιά ανώτατου επιπέδου: NSPrivacyTracking (Boolean), NSPrivacyTrackingDomains (Array), NSPrivacyCollectedDataTypes (Array), NSPrivacyAccessedAPITypes (Array).
Το κλειδί NSPrivacyTracking — λογική τιμή που υποδεικνύει εάν η εφαρμογή χρησιμοποιεί παρακολούθηση (απαιτεί ATT). Εάν true, πρέπει επίσης να καθοριστεί το NSUserTrackingUsageDescription στο Info.plist. Το κλειδί NSPrivacyTrackingDomains — πίνακας τομέων στους οποίους εφαρμόζεται παρακολούθηση.
Το κλειδί NSPrivacyCollectedDataTypes — πίνακας λεξικών, κάθε ένα από τα οποία περιγράφει τον τύπο συλλεγόμενων δεδομένων: κατηγορία (NSPrivacyCollectedDataType), υποχρεωτικότητα (NSPrivacyCollectedDataTypeLinked), σκοπός (NSPrivacyCollectedDataTypePurposes). Οι σκοποί περιλαμβάνουν: σήμανση τρίτων, αναλυτικά στοιχεία, ανάπτυξη προϊόντος και εξατομίκευση περιεχομένου.
Το κλειδί NSPrivacyAccessedAPITypes — πίνακας λεξικών για κάθε κατηγορία Required Reason API: κατηγορία (NSPrivacyAccessedAPITypeReasons) — συγκεκριμένος λόγος από την εγκεκριμένη λίστα της Apple και NSPrivacyAccessedAPIType — αναγνωριστικό κατηγορίας 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>
Οι τύποι δεδομένων χωρίζονται σε διάφορες κατηγορίες: στοιχεία επικοινωνίας (όνομα, email, τηλέφωνο), οικονομικά (δεδομένα πληρωμής), αναγνωριστικά (IDFA, User ID), δεδομένα χρήσης (αρχεία καταγραφής, κλικ), διαγνωστικά (crash logs) και περιεχόμενο χρήστη (φωτογραφίες, βίντεο, αρχεία). Κάθε κατηγορία επιπλέον σημειώνεται ως «συνδεδεμένη με τον χρήστη" (linked) ή «μη συνδεδεμένη" (not linked).
Linked σημαίνει ότι τα δεδομένα συνδέονται με τον λογαριασμό του χρήστη· not linked — τα δεδομένα είναι συγκεντρωτικά ή ανωνυμοποιημένα. Από αυτή τη σήμανση εξαρτάται πώς η Apple εμφανίζει την ετικέτα απορρήτου: τα linked δεδομένα σημειώνονται με κίτρινο, τα not linked — με πράσινο.
Η Apple έχει διακρίνει αρκετές κατηγορίες API, κάθε χρήση των οποίων πρέπει να συνοδεύεται από συγκεκριμένο λόγο από την εγκεκριμένη λίστα. Ο λόγος είναι ένα μοναδικός κωδικός, για παράδειγμα C617.1 ή 35F9.1, που αντιστοιχεί σε συγκεκριμένο σκοπό εγκεκριμένο από την Apple.
Η κατηγορία NSPrivacyAccessedAPICategoryFileTimestamp περιλαμβάνει API για πρόσβαση σε χρονικές σφραγίδες αρχείων (creationDate, modificationDate). Λόγοι: C617.1 (συγχρονισμός αρχείων), 3B52.1 (δημιουργία αντιγράφων ασφαλείας), 0A2A.1 (αντι-απάτη).
Η κατηγορία NSPrivacyAccessedAPICategoryDiskSpace περιλαμβάνει API για έλεγχο ελεύθερου χώρου στο δίσκο (NSFileManager. Έλεγχοι (NSFileManager). Λόγοι: E174.1 (διαχείριση προσωρινής μνήμης), 85F4.1 (λήψη περιεχομένου), B728.1 (διαγνωστικά).
Η κατηγορία NSPrivacyAccessedAPICategorySystemBootTime περιλαμβάνει API πρόσβασης στον χρόνο εκκίνησης συστήματος (uptime). Υπάρχει μόνο ένας λόγος: 35F9.1 (μέτρηση χρόνου συνεδρίας για αναλυτικά στοιχεία). Οποιαδήποτε άλλη χρήση θεωρείται fingerprinting.
Κάθε κατηγορία έχει 1 έως 5 εγκεκριμένους λόγους. Ο προγραμματιστής υποχρεούται να επιλέξει τον λόγο που αντιστοιχεί ακριβέστερα στην πραγματική χρήση του API. Η παροχή ψευδούς λόγου μπορεί να οδηγήσει σε απόρριψη της έκδοσης ή αποκλεισμό του λογαριασμού.
Από 1 Μαΐου 2024, όλα τα SDK τρίτων — τόσο δυαδικά όσο και ανοιχτού κώδικα — υποχρεούνται να συμπεριλαμβάνουν το Privacy Manifest στο πακέτο τους. Η Apple ελέγχει τα manifest για όλες τις εξαρτήσεις, και εάν τουλάχιστον ένα SDK δεν έχει manifest, η έκδοση θα απορριφθεί.
Μεγάλα SDK (Firebase, Adjust, AppsFlyer, Facebook SDK) έχουν ήδη ενημερώσει τα πακέτα τους. Εάν το έργο σας χρησιμοποιεί ένα λιγότερο γνωστό SDK, ελέγξτε την έκδοσή του και εάν χρειάζεται ενημερώστε το ή επικοινωνήστε με τον προγραμματιστή. Προσωρινή λύση — μη αυτόματη προσθήκη manifest για το SDK στο έργο, αλλά δεν συνιστάται λόγω αποκλίσεων κατά τις ενημερώσεις.
Το Privacy Info.xcprivacy μπορεί να δημιουργηθεί μέσω του ενσωματωμένου προτύπου Xcode 15+ ή χειροκίνητα. Θα εξετάσουμε και τις δύο επιλογές.
Στο Xcode 15 προστέθηκε το πρότυπο Privacy Manifest: File → New → File → Resource → Privacy Manifest. Το Xcode δημιουργεί ένα αρχείο με βασική δομή και συμπληρώνει το NSPrivacyTracking και κενούς πίνακες για API και δεδομένα. Μετά τη δημιουργία, πρέπει να καθορίσετε χειροκίνητα τους λόγους για κάθε χρησιμοποιούμενο Required Reason API.
Το πρότυπο προσθέτει αυτόματα το αρχείο στον κύριο στόχο. Εάν το έργο έχει πολλούς στόχους (Extensions, Watch app), το manifest πρέπει να προστεθεί σε κάθε ένα. Το Xcode δεν ελέγχει την παρουσία manifest στις εξαρτήσεις κατά το στάδιο μεταγλώττισης — μόνο κατά το στάδιο αρχειοθέτησης.
// AppDelegate: έλεγχος manifest στο στάδιο ανάπτυξης
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")
}
Μπορείτε να δημιουργήσετε το PrivacyInfo.xcprivacy χειροκίνητα ως ένα συνηθισμένο αρχείο XML property list. Για αυτό, δημιουργήστε ένα αρχείο με όνομα PrivacyInfo.xcprivacy, γράψτε την τυπική κεφαλίδα plist και προσθέστε ένα ριζικό λεξικό με τα απαραίτητα κλειδιά. Βεβαιωθείτε ότι το αρχείο έχει προστεθεί στον στόχο (Target Membership).
Η χειροκίνητη μέθοδος είναι χρήσιμη όταν χρειάζεται να προσθέσετε manifest σε μια στατική βιβλιοθήκη ή εξάρτηση Package Manager χωρίς τη χρήση του περιβάλλοντος Xcode. Μετά τη μεταγλώττιση, ελέγξτε εάν το αρχείο έχει εισαχθεί στο δυαδικό μέσω της εντολής nm ή αρχειοθέτησης.
Πριν στείλετε την έκδοση στο App Store, πρέπει να ελέγξετε ότι το Privacy Manifest είναι σωστό και πλήρες. Η Apple παρέχει διάφορα εργαλεία ελέγχου.
Κατά την αρχειοθέτηση του έργου (Product → Archive) το Xcode εκτελεί έλεγχο των manifest. Εάν εντοπιστεί σφάλμα — έλλειψη manifest, λανθασμένος λόγος, κενή κατηγορία — η αρχειοθέτηση ολοκληρώνεται με σφάλμα. Το αρχείο σφαλμάτων εμφανίζεται στο Issue navigator με ένδειξη του προβληματικού SDK και κατηγορίας API.
Πρόσθετος έλεγχος εκτελείται από το App Store Connect κατά τη μεταφόρτωση της έκδοσης. Εάν η επικύρωση αποτύχει, η έκδοση απορρίπτεται με αυτόματο email που περιέχει το αναγνωριστικό του προβληματικού API και τη συνιστώμενη διόρθωση.
Για αυτοματοποίηση του ελέγχου, χρησιμοποιήστε σενάρια που αναλύουν το δυαδικό για χρήση Required Reason API. Η Apple παρέχει το εργαλείο libtool και σενάρια ελέγχου συμβόλων, αλλά η κοινότητα έχει αναπτύξει πιο βολικά βοηθήματα.
# Αναζήτηση χρήσης FileTimestamp API στο δυαδικό
nm MyApp.app/MyApp | grep "NSFileCreationDate"
# Έλεγχος ύπαρξης PrivacyInfo.xcprivacy στην εφαρμογή
find MyApp.app -name "*.xcprivacy"
Το πιο συνηθισμένο σφάλμα — έλλειψη manifest σε ένα από τα SDK. Ακόμα κι αν ο κύριος στόχος περιέχει manifest, η Apple ελέγχει όλα τα δυαδικά ξεχωριστά. Το δεύτερο πιο συνηθισμένο — λανθασμένος κωδικός λόγου: χρήση λόγου για μια κατηγορία API με API από άλλη κατηγορία.
Το τρίτο σφάλμα — υπερβολική δήλωση API που στην πραγματικότητα δεν χρησιμοποιούνται. Οι προγραμματιστές προσθέτουν όλους τους πιθανούς λόγους «για κάθε ενδεχόμενο", κάτι που ανησυχεί τους ελεγκτές της Apple. Προσθέστε μόνο τις κατηγορίες που πραγματικά χρησιμοποιούνται. Χρησιμοποιήστε τον στατικό αναλυτή του Xcode για έλεγχο.
Συχνές ερωτήσεις
Από 1 Μαΐου 2024, η Apple απορρίπτει οποιαδήποτε έκδοση χωρίς manifest. Το σφάλμα εμφανίζεται στο στάδιο μεταφόρτωσης στο App Store Connect. Οι παλιές εφαρμογές δεν μπλοκάρονται, αλλά οι ενημερώσεις απαιτούν υποχρεωτική συμπερίληψη του manifest.
Ναι, το manifest είναι υποχρεωτικό για όλες τις πλατφόρμες Apple: iOS, iPadOS, macOS, tvOS, watchOS και visionOS. Οι απαιτήσεις για Required Reason API είναι ενιαίες για όλες τις πλατφόρμες, αν και τα σύνολα API μπορεί να διαφέρουν ελαφρώς.
Εάν το SDK δεν παρείχε manifest, δημιουργήστε ένα ξεχωριστό αρχείο PrivacyInfo.xcprivacy και προσθέστε το στην ομάδα SDK στο έργο. Καθορίστε λόγους για τα API που χρησιμοποιεί αυτό το SDK, βάσει της τεκμηρίωσης του SDK.
Ναι. Κατά τον αυτόματο έλεγχο, η Apple συγκρίνει τους δηλωμένους λόγους με τις πραγματικές κλήσεις API. Η ασυμφωνία οδηγεί σε απόρριψη. Κατά τον χειροκίνητο έλεγχο, ο ελεγκτής μπορεί να ζητήσει διευκρινίσεις.
Ναι, η Apple ελέγχει τα manifest για όλες τις εξαρτήσεις, συμπεριλαμβανομένου του SPM. Οι πάροχοι πακέτων υποχρεούνται να συμπεριλαμβάνουν το PrivacyInfo.xcprivacy στα αποθετήριά τους. Το Xcode προειδοποιεί για ελλείποντα manifest κατά την αρχειοθέτηση.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης