Privacy Manifest (PrivacyInfo.xcprivacy) — a fájl, amelyet minden alkalmazásnak és harmadik féltől származó SDK-nak kötelezően tartalmaznia kell az iOS buildben 2024 tavaszától. Az Apple megköveteli a védett API-k (Required Reason API) használati okainak és az összegyűjtött adatok típusainak deklarálását. Az Apple Developer Documentation szerint az alkalmazás összetételében minden binárisnak — fő target, keretrendszerek, Swift Package Manager függőségek — saját Privacy Manifestet kell tartalmaznia.
Főbb pontok
A Privacy Manifest a PrivacyInfo.xcprivacy fájl property list (XML) formátumban, amely deklarálja, hogy az alkalmazás milyen típusú adatokat gyűjt és miért használ bizonyos API-kat. Az Apple a manifesteket az adatvédelmi átláthatóság növelésére irányuló kezdeményezés részeként vezette be, hasonlóan a Privacy Nutrition Label-hez, de kód- és bináris szinten.
A manifest fő célja az úgynevezett Required Reason API-k használatának dokumentálása. Ezek olyan API kategóriák, amelyek felhasználhatók az eszköz digitális ujjlenyomatának levételére (fingerprinting), ezért minden használatukat egy konkrét ok deklarálásával kell kísérni az Apple által jóváhagyott listáról.
2024. május 1-től az Apple elutasítja azokat a buildeket, amelyek nem tartalmaznak Privacy Manifestet. Ez vonatkozik az alkalmazás fő targetjeire és az összes beágyazott SDK-ra és függőségre is. A WWDC 2023 szerint a manifest kötelező minden App Store-on keresztül terjesztett alkalmazás számára.
A manifestnek minden binárisban jelen kell lennie — nem csak a fő alkalmazásban, hanem minden keretrendszerben és statikus könyvtárban is. Ha egy harmadik féltől származó SDK nem biztosított manifestet, a fejlesztőnek kézzel kell hozzáadnia vagy kapcsolatba kell lépnie az SDK szolgáltatójával a frissítés érdekében.
A manifestek megjelenése előtt a fejlesztők kiterjedt rendszer API-kat (hozzáférés a fájlrendszerhez, dátum/idő, rendszernaplók) használhattak átlátható magyarázat nélkül a használat céljáról. Ez adatszivárgás kockázatát teremtette meg harmadik féltől származó SDK-ken keresztül, amelyek a fejlesztő tudta nélkül gyűjthettek információkat.
A Mysk Inc. (2023) adatai szerint sok népszerű SDK használt API-kat az eszköz ujjlenyomatának levételére nyilvánvaló szükség nélkül — például az uptime idő olvasása az időzóna meghatározásához vagy könyvtárak szkennelése metaadatok gyűjtéséhez. A Privacy Manifest kötelezi minden ilyen művelet deklarálását.
A Required Reason API-k mellett a manifest tartalmazza az NSPrivacyTracking szakaszt — egy jelzőt, amely megmutatja, hogy az alkalmazás használ-e követést (ATT-t igényel) és az NSPrivacyCollectedDataTypes — a gyűjtött adatok típusainak listáját Privacy Nutrition Label formátumban.
A Privacy Nutrition Label egy felhasználóbarát megjelenítés az alkalmazás App Store oldalán, amely megmutatja, hogy az alkalmazás milyen adatokat gyűjt. A Privacy Manifest egy technikai fájl a binárison belül, amelyet az Apple automatikusan ellenőriz. Ha a manifest adatai nem egyeznek az App Store Connect címkéivel, az Apple elutasítja a buildet.
Így a manifest az igazság forrása az Apple ellenőrző rendszere számára. Ennek alapján automatikusan generálódnak az adatvédelmi címkék, de a fejlesztőnek mindkét megjelenítést naprakészen kell tartania. A manifest publikálás utáni módosítása új build beküldését igényli felülvizsgálatra.
A PrivacyInfo.xcprivacy fájl a property list formátumot használja Dictionary gyökértípussal. A legfelső szint fő kulcsai: NSPrivacyTracking (Boolean), NSPrivacyTrackingDomains (Array), NSPrivacyCollectedDataTypes (Array), NSPrivacyAccessedAPITypes (Array).
Az NSPrivacyTracking kulcs — logikai érték, amely jelzi, hogy az alkalmazás használ-e követést (ATT-t igényel). Ha true, meg kell adni az NSUserTrackingUsageDescription-t is az Info.plist-ben. Az NSPrivacyTrackingDomains kulcs — a tartományok tömbje, ahol a követést alkalmazzák.
Az NSPrivacyCollectedDataTypes kulcs — szótárak tömbje, amelyek mindegyike leírja a gyűjtött adatok típusát: kategória (NSPrivacyCollectedDataType), kötelezőség (NSPrivacyCollectedDataTypeLinked), cél (NSPrivacyCollectedDataTypePurposes). A célok közé tartozik: harmadik felek megjelölése, analitika, termékfejlesztés és tartalom személyre szabása.
Az NSPrivacyAccessedAPITypes kulcs — szótárak tömbje minden Required Reason API kategóriához: kategória (NSPrivacyAccessedAPITypeReasons) — konkrét ok az Apple jóváhagyott listájáról és NSPrivacyAccessedAPIType — az API kategória azonosítója.
<!-- 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>
Az adattípusok több kategóriára oszlanak: kapcsolattartási adatok (név, e-mail, telefon), pénzügyek (fizetési adatok), azonosítók (IDFA, User ID), használati adatok (naplók, kattintások), diagnosztika (crash logs) és felhasználói tartalom (fotók, videók, fájlok). Minden kategória további jelölést kap: „felhasználóhoz kapcsolódó" (linked) vagy „nem kapcsolódó" (not linked).
A linked azt jelenti, hogy az adatok kapcsolódnak a felhasználói fiókhoz; a not linked — az adatok aggregáltak vagy anonimizáltak. Ettől a jelöléstől függ, hogy az Apple hogyan jeleníti meg az adatvédelmi címkét: a linked adatok sárgával, a not linked zölddel vannak jelölve.
Az Apple több API kategóriát különített el, amelyek minden használatát egy konkrét okkal kell kísérni a jóváhagyott listáról. Az ok egy egyedi kód, például C617.1 vagy 35F9.1, amely egy adott, az Apple által engedélyezett célnak felel meg.
Az NSPrivacyAccessedAPICategoryFileTimestamp kategória a fájlok időbélyegeihez való hozzáférés API-it tartalmazza (creationDate, modificationDate). Okok: C617.1 (fájlszinkronizálás), 3B52.1 (biztonsági mentés), 0A2A.1 (csalás elleni védelem).
Az NSPrivacyAccessedAPICategoryDiskSpace kategória a szabad lemezterület ellenőrzésére szolgáló API-kat tartalmazza (NSFileManager. Ellenőrzések (NSFileManager). Okok: E174.1 (gyorsítótár-kezelés), 85F4.1 (tartalom letöltése), B728.1 (diagnosztika).
Az NSPrivacyAccessedAPICategorySystemBootTime kategória a rendszer indítási idejéhez való hozzáférés API-it tartalmazza (uptime). Csak egy ok létezik: 35F9.1 (munkamenet idő mérése analitikához). Bármilyen más használat fingerprintingnek minősül.
Minden kategóriának 1 és 5 közötti jóváhagyott oka van. A fejlesztő köteles kiválasztani azt az okot, amely a legpontosabban megfelel az API tényleges használatának. Helytelen ok megadása a build elutasításához vagy a fiók letiltásához vezethet.
2024. május 1-től minden harmadik féltől származó SDK — mind a bináris, mind a nyílt forráskódú — köteles belefoglalni a Privacy Manifestet a csomagjába. Az Apple ellenőrzi a manifesteket az összes függőséghez, és ha legalább egy SDK-nak nincs manifestje, a build elutasításra kerül.
A nagy SDK-k (Firebase, Adjust, AppsFlyer, Facebook SDK) már frissítették csomagjaikat. Ha a projekt egy kevésbé ismert SDK-t használ, ellenőrizze a verzióját, és szükség esetén frissítse vagy lépjen kapcsolatba a fejlesztővel. Ideiglenes megoldás a manifest kézi hozzáadása az SDK-hoz a projektben, de ez nem ajánlott a frissítések során fellépő eltérések miatt.
A Privacy Info.xcprivacy az Xcode 15+ beépített sablonjával vagy kézzel hozható létre. Mindkét lehetőséget megvizsgáljuk.
Az Xcode 15-ben hozzáadták a Privacy Manifest sablont: File → New → File → Resource → Privacy Manifest. Az Xcode létrehoz egy fájlt alapstruktúrával, és kitölti az NSPrivacyTracking-ot és az üres tömböket az API-khoz és adatokhoz. A létrehozás után kézzel kell megadni az okokat minden használt Required Reason API-hoz.
A sablon automatikusan hozzáadja a fájlt a fő targethez. Ha a projekt több targetet tartalmaz (Extensions, Watch app), a manifestet mindegyikhez hozzá kell adni. Az Xcode nem ellenőrzi a manifest jelenlétét a függőségekben a fordítási szakaszban — csak az archiválási szakaszban.
// AppDelegate: manifest ellenőrzése a fejlesztési szakaszban
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")
}
A PrivacyInfo.xcprivacy kézzel is létrehozható egy szokásos XML property list fájlként. Ehhez hozzon létre egy PrivacyInfo.xcprivacy nevű fájlt, írja meg a szabványos plist fejlécet, és adja hozzá a gyökér szótárat a szükséges kulcsokkal. Győződjön meg róla, hogy a fájl hozzá van adva a targethez (Target Membership).
A kézi módszer akkor hasznos, ha manifestet kell hozzáadni egy statikus könyvtárhoz vagy Package Manager függőséghez az Xcode felület használata nélkül. Fordítás után ellenőrizze, hogy a fájl bekerült-e a binárisba a nm paranccsal vagy archiválással.
Mielőtt elküldené a buildet az App Store-ba, ellenőriznie kell, hogy a Privacy Manifest helyes és teljes-e. Az Apple több ellenőrző eszközt biztosít.
A projekt archiválásakor (Product → Archive) az Xcode elvégzi a manifestek ellenőrzését. Ha hibát észlel — hiányzó manifest, helytelen ok, üres kategória — az archiválás hibával végződik. A hibanapló az Issue navigator-ban jelenik meg a problémás SDK és API kategória megjelölésével.
További ellenőrzést végez az App Store Connect a build feltöltésekor. Ha az érvényesítés sikertelen, a build elutasításra kerül egy automatikus e-maillel, amely tartalmazza a problémás API azonosítóját és az ajánlott javítást.
Az ellenőrzés automatizálásához használjon szkripteket, amelyek elemzik a binárist a Required Reason API használatára. Az Apple biztosítja a libtool eszközt és a szimbólumellenőrző szkripteket, de a közösség kényelmesebb segédprogramokat fejlesztett ki.
# FileTimestamp API használatának keresése a binárisban
nm MyApp.app/MyApp | grep "NSFileCreationDate"
# PrivacyInfo.xcprivacy jelenlétének ellenőrzése az alkalmazásban
find MyApp.app -name "*.xcprivacy"
A leggyakoribb hiba — a manifest hiánya az egyik SDK-ban. Még ha a fő target tartalmazza is a manifestet, az Apple minden binárist külön ellenőriz. A második leggyakoribb — helytelen okkód: egy API kategória okának használata egy másik kategóriába tartozó API-val.
A harmadik hiba — az túlzott deklarálása olyan API-knak, amelyeket valójában nem használnak. A fejlesztők minden lehetséges okot hozzáadnak „biztonság kedvéért", ami aggasztja az Apple felülvizsgálóit. Csak azokat a kategóriákat adja hozzá, amelyeket ténylegesen használ. Használja az Xcode statikus elemzőjét az ellenőrzéshez.
Gyakran ismételt kérdések
2024. május 1-től az Apple elutasít minden buildet manifest nélkül. A hiba az App Store Connect-be történő feltöltés szakaszában jelentkezik. A régi alkalmazások nincsenek blokkolva, de a frissítések a manifest kötelező belefoglalását igénylik.
Igen, a manifest kötelező az összes Apple platformhoz: iOS, iPadOS, macOS, tvOS, watchOS és visionOS. A Required Reason API követelményei egységesek minden platformon, bár az API készletek kissé eltérhetnek.
Ha az SDK nem biztosított manifestet, hozzon létre egy külön PrivacyInfo.xcprivacy fájlt, és adja hozzá az SDK csoporthoz a projektben. Adja meg azokat az okokat az API-khoz, amelyeket ez az SDK használ, az SDK dokumentációja alapján.
Igen. Az automatikus ellenőrzés során az Apple összehasonlítja a deklarált okokat a tényleges API-hívásokkal. Az eltérés elutasításhoz vezet. A kézi ellenőrzés során a felülvizsgáló magyarázatot kérhet.
Igen, az Apple ellenőrzi a manifesteket minden függőséghez, beleértve az SPM-et is. A csomagszolgáltatók kötelesek belefoglalni a PrivacyInfo.xcprivacy-t a tárolóikba. Az Xcode figyelmeztet a hiányzó manifestekre archiváláskor.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is