# ITMS-91053: oprava „Missing API declaration“ v Expo

> ITMS-91053: tvoj build používa API s povinným dôvodom bez deklarácie. Pridaj kategóriu a kód do ios.privacyManifests a sprav nový build.

Pôvodná stránka: [ITMS-91053: oprava „Missing API declaration“ v Expo](https://devoria.fr/sk/blog/itms-91053-missing-api-declaration-expo)
Autor: [Mehdi Azizi](https://devoria.fr/sk/mehdi-azizi)
Zverejnenie: 2026-10-25
Posledná revízia obsahu: 2026-10-25


ITMS-91053 je automatická kontrola Apple, ktorá ti príde e-mailom po [odoslaní buildu](https://devoria.fr/sk/blog/eas-submit-ios-publikovat-expo-appku-app-store). Hovorí, že kód tvojej appky používa API „s povinným dôvodom“ (preferencie, časové údaje súborov, čas od spustenia systému, miesto na disku alebo klávesnice) a v jej manifeste súkromia nevysvetľuje prečo. **V Expo to opravíš v `ios.privacyManifests`: kategória, ktorú Apple uvádza, kód popisujúci tvoje skutočné použitie a potom nový build.**

V Solys, mojom budíku s minihrami, sú tieto dôvody deklarované v konfigurácii appky. Ukážem ti jej skutočnú deklaráciu, príkaz, ktorý vypíše, čo používajú tvoje závislosti, a kontrolu výsledného súboru pred odoslaním.

## Čo znamená chyba ITMS-91053?

Správa má názov „ITMS-91053: Missing API declaration“. Hovorí, že kód v konkrétnom súbore tvojho buildu odkazuje na jedno alebo viac API, ktoré vyžadujú dôvod. Potom vypíše dotknuté kategórie, napríklad `NSPrivacyAccessedAPICategoryUserDefaults`.

Tieto API nežiadajú od používateľa žiadne povolenie. Dajú sa však použiť na rozpoznanie zariadenia, čo Apple volá fingerprinting. Ten je zakázaný, aj keď používateľ so sledovaním súhlasí. Apple to vysvetľuje na stránke o [API s povinným dôvodom](https://developer.apple.com/documentation/bundleresources/describing-use-of-required-reason-api): každá appka a každé SDK musí deklarovať, prečo ich používa.

Tá istá stránka stanovuje pravidlo: **od 1. mája 2024 App Store Connect neprijme appku, ktorá tieto použitia nepopisuje vo svojom manifeste.** Niektorí vývojári hlásili tento e-mail len ako varovanie pri prijatom builde. Nespoliehaj sa na to: ber to ako blokáciu a oprav to pred ďalším odoslaním.

Rovnako ako ostatné chyby ITMS to nie je zamietnutie od reviewera. Nikto tvoju appku neotvoril: Apple analyzoval binárku.

## Privacy manifest v iOS: súbor PrivacyInfo.xcprivacy

Manifest súkromia je súbor s názvom `PrivacyInfo.xcprivacy`, umiestnený v koreni bundlu appky. Podľa [dokumentácie Apple k privacy manifestom](https://developer.apple.com/documentation/bundleresources/privacy-manifest-files) popisuje zbierané dáta, sledovanie a API s povinným dôvodom. Tie posledné idú do poľa `NSPrivacyAccessedAPITypes`: jedna položka na kategóriu, s jej typom a zoznamom dôvodov.

Zradný bod: **manifest pokrýva iba svoj vlastný bundle.** Apple to píše: každý spustiteľný súbor alebo dynamická knižnica, ktorá tieto API používa, musí mať manifest vo svojom bundli. Manifest tvojej appky nepokrýva vložený framework a SDK sa nemôže spoliehať na manifest tvojej appky.

Nemýľ si ho s textami v Info.plist, ktoré vyžaduje [ITMS-90683](https://devoria.fr/sk/blog/itms-90683-missing-purpose-string-expo). Tie sa zobrazujú používateľovi pri žiadosti o povolenie. Manifest číta iba Apple.

## 5 kategórií API a ich kódy dôvodov

Celý názov kategórie začína na `NSPrivacyAccessedAPICategory`. Zoznam API a dôvodov nájdeš na stránke kľúča [NSPrivacyAccessedAPIType](https://developer.apple.com/documentation/bundleresources/app-privacy-configuration/nsprivacyaccessedapitypes/nsprivacyaccessedapitype), prečítanej 15. októbra 2026.

| Kategória       | Typické API                  | Bežný dôvod |
| --------------- | ---------------------------- | ----------- |
| UserDefaults    | `UserDefaults`               | CA92.1      |
| FileTimestamp   | `creationDate`               | C617.1      |
| SystemBootTime  | `systemUptime`               | 35F9.1      |
| DiskSpace       | `volumeAvailableCapacityKey` | E174.1      |
| ActiveKeyboards | `activeInputModes`           | 54BD.1      |

Kódy, na ktoré narazíš najčastejšie:

- **CA92.1**: appka číta a zapisuje vlastné preferencie, nedostupné pre iné appky.
- **1C8F.1**: preferencie zdieľané s widgetom alebo rozšírením v rovnakej App Group.
- **C617.1**: dátumy alebo veľkosť súborov uložených v kontajneri appky.
- **3B52.1**: súbory, ktoré vybral používateľ, napríklad v dialógu na výber dokumentov.
- **35F9.1**: meranie času medzi dvoma udalosťami v appke alebo beh časovača.
- **E174.1**: kontrola voľného miesta pred zápisom súborov, s viditeľným efektom pre používateľa.
- **85F4.1**: zobrazenie miesta na disku používateľovi.

**Deklaruj dôvod, ktorý zodpovedá tvojmu skutočnému použitiu, nie ten, ktorý vyzerá najširší.** Apple upresňuje, že tieto API a ich dáta slúžia iba na deklarované dôvody a nikdy na sledovanie. Dva kódy sú vyhradené pre SDK tretích strán: C56D.1 a 0A2A.1. V manifeste tvojej appky nemajú čo robiť.

## Deklarácia privacy manifestu v Expo

V Expo súbor nepíšeš sám. Popíšeš ho pod `expo.ios.privacyManifests` v app.json alebo app.config a prebuild vygeneruje `PrivacyInfo.xcprivacy`. To je postup z [dokumentácie Expo k privacy manifestom](https://docs.expo.dev/guides/apple-privacy/).

Tu je skutočný výňatok z konfigurácie Solys. Kľúč obsahuje aj sledovanie a zbierané dáta, ktoré som tu vynechal:

```json
{
  "expo": {
    "ios": {
      "privacyManifests": {
        "NSPrivacyAccessedAPITypes": [
          {
            "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults",
            "NSPrivacyAccessedAPITypeReasons": ["CA92.1", "1C8F.1"]
          },
          {
            "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryFileTimestamp",
            "NSPrivacyAccessedAPITypeReasons": ["C617.1"]
          },
          {
            "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategorySystemBootTime",
            "NSPrivacyAccessedAPITypeReasons": ["35F9.1"]
          }
        ]
      }
    }
  }
}
```

CA92.1, C617.1 a 35F9.1 preberajú to, čo deklaruje React Native a Expo moduly appky. 1C8F.1 pochádza zo samotného Solys: appka zdieľa nastavenia so svojím widgetom cez App Group.

Pasca, o ktorej treba vedieť: ak je tvoj priečinok `ios` generovaný a ignorovaný gitom, **ručne napísaný `PrivacyInfo.xcprivacy` v tomto priečinku sa do buildu nikdy nedostane.** EAS znova spustí prebuild a priečinok pregeneruje. Overil som si to na jednom z mojich projektov 9. septembra 2026: ručne napísaný manifest po prebuilde zmizol. Deklarácia musí byť v konfigurácii.

Posledná vec: manifest je súčasťou binárky. Vzdialená aktualizácia ho nezmení. Treba spraviť nový build a znova ho odoslať.

## SDK tretích strán s vlastným manifestom

Väčšina novších knižníc má vlastný manifest. Expo balíčky, ktoré tieto API používajú, majú `PrivacyInfo.xcprivacy` vo svojom priečinku `ios`, rovnako ako React Native. Problém je v tom, ako sú prepojené s tvojou appkou.

Dokumentácia Expo upozorňuje: Apple nečíta správne všetky manifesty závislostí CocoaPods linkovaných staticky, čo je prípad Expo balíčkov. Ich dôvody preto možno budeš musieť skopírovať do konfigurácie appky.

Aby si mal menej práce, nastavenie `ios.privacyManifestAggregationEnabled` v [expo-build-properties](https://docs.expo.dev/versions/latest/sdk/build-properties/) zlúči manifesty závislostí CocoaPods do jedného súboru. V Podfile, ktorý Expo generuje v mojich projektoch (SDK 57), je toto zlučovanie zapnuté, kým ho nevypneš.

Zlučovanie má limit: vidí iba závislosti, ktoré manifest majú. Staršia knižnica bez manifestu zostane neviditeľná. **Prečítaj si preto cestu k súboru uvedenú v e-maile**: povie ti, kde to opraviť.

| Uvedený súbor           | Kde opraviť            |
| ----------------------- | ---------------------- |
| Spustiteľný súbor appky | `ios.privacyManifests` |
| `.framework`            | Aktualizovať SDK       |
| Rozšírenie `.appex`     | Manifest rozšírenia    |

## Kontrola pred odoslaním

Expo navrhuje počkať po odoslaní na e-mail od Apple. Funguje to, ale každé kolo stojí jeden build. Tu sú štyri kontroly, ktoré robím vopred.

**1. Vypíš, čo deklarujú tvoje závislosti.** Z koreňa projektu:

```bash
find node_modules -name PrivacyInfo.xcprivacy -not -path '*/example/*' \
  -exec grep -ho "NSPrivacyAccessedAPICategory[A-Za-z]*" {} + | sort | uniq -c
```

V Solys príkaz 15. októbra 2026 našiel 13 manifestov a štyri kategórie: časové údaje súborov, preferencie, čas od spustenia systému a miesto na disku. Každá vypísaná kategória musí byť vo výslednom manifeste appky alebo v manifeste frameworku, ktorý ju používa.

**2. Prehľadaj vlastný natívny kód.** Vlastné moduly, pluginy, targety ako widget: tento kód za teba žiadne SDK nedeklaruje.

```bash
grep -rlE "UserDefaults|systemUptime|mach_absolute_time|creationDate|modificationDate|volumeAvailableCapacity|activeInputModes" \
  --include='*.swift' --include='*.m' --include='*.mm' modules plugins targets
```

Priečinky prispôsob svojmu projektu. V Solys práve toto hľadanie odhalí preferencie zdieľané cez App Group, odtiaľ kód 1C8F.1.

**3. Prečítaj vygenerovaný manifest.** Spusti `npx expo prebuild -p ios` a otvor `ios/<NazovTvojejAppky>/PrivacyInfo.xcprivacy`. Pozor: tento príkaz môže priečinok `ios` zmazať a vytvoriť nanovo. Ak si v ňom robil ručné úpravy, pracuj na kópii projektu.

**4. Skontroluj výsledný build.** Je to jediný dôkaz, ktorý sa počíta. Stiahni IPA zo stránky buildu na expo.dev a na Macu spusti:

```bash
unzip -q MonApp.ipa -d ipa
find ipa/Payload -name PrivacyInfo.xcprivacy
plutil -p ipa/Payload/*.app/PrivacyInfo.xcprivacy
```

Druhý riadok vypíše všetky vložené manifesty, appky aj frameworkov. Tretí zobrazí manifest appky, ktorý porovnáš so zoznamom z kroku 1.

## Čo musí manifest hovoriť v súlade s tvojou stránkou v obchode

Manifest nežije sám. Ak deklaruje sledovanie alebo zbierané dáta, tvoja stránka v App Store a zásady ochrany súkromia musia hovoriť to isté. Nesúlad medzi týmito tromi ťa potom môže stáť zamietnutie od človeka podľa [guideline 5.1.1](https://devoria.fr/sk/blog/guideline-5-1-1-zamietnutie-app-store). Čo treba zladiť, je podrobne v článku [zásady ochrany súkromia aplikácie](https://devoria.fr/sk/blog/zasady-ochrany-osobnych-udajov-ios-aplikacia).

## Odošli build bez nepríjemných prekvapení

Chyby ITMS sa opravujú rýchlo, keď ich vieš čítať. Zamietnutia, ktoré prídu potom, si žiadajú viac nadhľadu: postup je na stránke [aplikácia zamietnutá Apple](https://devoria.fr/sk/expertise/aplikacia-zamietnuta-apple) a najčastejšie dôvody v článku [prečo Apple zamieta appky](https://devoria.fr/sk/blog/zamietnutie-aplikacie-apple-pricina).

Na kontrolu pred odoslaním máš [Apple Review Kit](https://devoria.fr/sk/kits/review-apple), ktorý obsahuje môj checklist a skills pre Claude Code, ktoré prejdú tvoj projekt. Ak sa ti odoslanie zasekne a chceš ľudský pohľad, [rezervuj si so mnou hodinu](https://devoria.fr/sk/coaching): prejdeme tvoj projekt cez videohovor, na tvojej obrazovke. A ak chystáš svoje prvé vydanie, [sprav si bezplatnú diagnostiku](https://devoria.fr/sk/diagnostic): zoradí kroky v správnom poradí a pošle ti môj checklist proti zamietnutiu od Apple.

## Často kladené otázky

### Blokuje ITMS-91053 odoslanie môjho buildu?

Apple píše, že od 1. mája 2024 App Store Connect neprijíma appky, ktoré nepopisujú, ako tieto API používajú. Niektorí vývojári však e-mail dostali pri prijatom builde, ako varovanie. V oboch prípadoch oprav manifest pred ďalším buildom.

### Aký kód dôvodu zvoliť pre UserDefaults?

CA92.1, ak appka číta a zapisuje iba vlastné preferencie. Pridaj 1C8F.1, ak ich zdieľa s widgetom alebo rozšírením cez App Group. C56D.1 je vyhradený pre SDK tretích strán: do manifestu svojej appky ho nedávaj.

### Musím kopírovať manifest každého SDK do app.json?

Nie nevyhnutne. Ak je zlučovanie manifestov zapnuté, manifesty závislostí CocoaPods sa spoja pri inštalácii podov. Kategóriu skopíruj iba vtedy, ak vo výslednom manifeste chýba, s dôvodom, ktorý popisuje skutočné použitie.

### Potrebuje môj widget alebo rozšírenie vlastný manifest?

Podľa Apple musí mať vlastný manifest každý bundle, ktorý obsahuje spustiteľný súbor používajúci tieto API. Rozšírenie je samostatný spustiteľný súbor vo vlastnom bundli: manifest appky ho nepokrýva.

### Dá sa ITMS-91053 opraviť bez nového buildu?

Nie. Manifest súkromia je súčasťou binárky. Oprav konfiguráciu, sprav nový build a otestuj ho v [TestFlight](https://devoria.fr/sk/blog/testflight-otestovat-iphone-aplikaciu) pred odoslaním na review.


## Tvoj projekt

[Apple Review Kit](https://devoria.fr/sk/kits/review-apple): Checklist na App Store review, ktorý používam, moje opravené zamietnutia od Apple, poznámky pre testera a dva skills pre Claude Code, ktoré skontrolujú tvoju appku. 29 €.

[iOS Kit](https://devoria.fr/sk/kits/ios): Vytvor iPhone appku s Claude Code: štartovací kód mojich appiek, skills, ktoré kontrolujú jeho prácu, a Apple Review Kit, App Store Screenshots Kit a ASO Kit. 129,99 €.
