# ITMS-91053: fiks «Missing API declaration» i Expo

> ITMS-91053: buildet ditt bruker et required reason-API uten å deklarere det. Legg kategorien og koden i ios.privacyManifests, og lag et nytt build.

Opprinnelig side: [ITMS-91053: fiks «Missing API declaration» i Expo](https://devoria.fr/no/blog/itms-91053-missing-api-declaration-expo)
Forfatter: [Mehdi Azizi](https://devoria.fr/no/mehdi-azizi)
Publisert: 2026-10-25
Innhold sist revidert: 2026-10-25


ITMS-91053 er en automatisk kontroll fra Apple. Den kommer på e-post etter at du har [levert buildet ditt](https://devoria.fr/no/blog/eas-submit-ios-publisere-expo-app-app-store). Den sier at koden i appen din bruker et API med «påkrevd begrunnelse» (preferanser, fildatoer, tid siden oppstart, diskplass eller tastaturer) uten å forklare hvorfor i personvernmanifestet. **Med Expo fikser du det i `ios.privacyManifests`: kategorien Apple nevner, koden som beskriver den faktiske bruken din, og så et nytt build.**

I Solys, vekkerklokka mi med minispill, er disse begrunnelsene deklarert i app-konfigurasjonen. Her er den faktiske deklarasjonen, kommandoen som lister hva avhengighetene dine bruker, og sjekken du bør gjøre på den ferdige filen før du sender inn.

## Hva betyr feilen ITMS-91053?

Meldingen har tittelen «ITMS-91053: Missing API declaration». Den sier at koden i en bestemt fil i buildet ditt refererer til ett eller flere API-er som krever en begrunnelse. Så lister den kategoriene det gjelder, for eksempel `NSPrivacyAccessedAPICategoryUserDefaults`.

Disse API-ene ber ikke brukeren om noen tillatelse. Men de kan brukes til å kjenne igjen en enhet, det Apple kaller fingerprinting. Det er forbudt, selv om brukeren godtar sporing. Apple forklarer det på siden om [API-er med påkrevd begrunnelse](https://developer.apple.com/documentation/bundleresources/describing-use-of-required-reason-api): hver app og hvert SDK må deklarere hvorfor de bruker dem.

Den samme siden slår fast regelen: **siden 1. mai 2024 godtar ikke App Store Connect en app som ikke beskriver denne bruken i manifestet sitt.** Noen utviklere har fått denne e-posten som en ren advarsel, på et build som ble godtatt. Ikke regn med det: behandle det som en blokkering og fiks det før neste innsending.

Som de andre ITMS-feilene er dette ikke en avvisning fra en reviewer. Ingen har åpnet appen din: Apple har analysert binærfilen.

## iOS-personvernmanifestet: filen PrivacyInfo.xcprivacy

Personvernmanifestet er en fil som heter `PrivacyInfo.xcprivacy`, plassert i roten av app-bundelen. Ifølge [Apples dokumentasjon om privacy manifests](https://developer.apple.com/documentation/bundleresources/privacy-manifest-files) beskriver den innsamlede data, sporing og API-er med påkrevd begrunnelse. De sistnevnte havner i tabellen `NSPrivacyAccessedAPITypes`: én oppføring per kategori, med type og liste over begrunnelser.

Fellen: **et manifest dekker bare sin egen bundle.** Apple skriver det rett ut: hver kjørbar fil eller dynamisk bibliotek som bruker disse API-ene, må ha et manifest i sin bundle. Manifestet til appen din dekker ikke et innebygd framework, og et SDK kan ikke lene seg på manifestet til appen din.

Ikke bland det med Info.plist-tekstene som [ITMS-90683](https://devoria.fr/no/blog/itms-90683-missing-purpose-string-expo) krever. De vises for brukeren i en tillatelsesforespørsel. Manifestet leses bare av Apple.

## De 5 API-kategoriene og begrunnelseskodene

Det fulle navnet på en kategori starter med `NSPrivacyAccessedAPICategory`. Listen over API-er og begrunnelser finner du på siden for nøkkelen [NSPrivacyAccessedAPIType](https://developer.apple.com/documentation/bundleresources/app-privacy-configuration/nsprivacyaccessedapitypes/nsprivacyaccessedapitype), lest 15. oktober 2026.

| Kategori        | Typisk API                   | Vanlig begrunnelse |
| --------------- | ---------------------------- | ------------------ |
| UserDefaults    | `UserDefaults`               | CA92.1             |
| FileTimestamp   | `creationDate`               | C617.1             |
| SystemBootTime  | `systemUptime`               | 35F9.1             |
| DiskSpace       | `volumeAvailableCapacityKey` | E174.1             |
| ActiveKeyboards | `activeInputModes`           | 54BD.1             |

Kodene du oftest kommer borti:

- **CA92.1**: appen leser og skriver sine egne preferanser, som andre apper ikke har tilgang til.
- **1C8F.1**: preferanser som deles med en widget eller en utvidelse i samme App Group.
- **C617.1**: datoer eller størrelse på filer som ligger i appens container.
- **3B52.1**: filer brukeren har valgt, for eksempel i en dokumentvelger.
- **35F9.1**: måle tiden mellom to hendelser i appen, eller kjøre en timer.
- **E174.1**: sjekke ledig plass før appen skriver filer, med en synlig effekt for brukeren.
- **85F4.1**: vise diskplass til brukeren.

**Deklarer begrunnelsen som passer den faktiske bruken din, ikke den som virker bredest.** Apple presiserer at disse API-ene og dataene deres bare skal brukes til de deklarerte begrunnelsene, og aldri til sporing. To koder er forbeholdt tredjeparts-SDK-er: C56D.1 og 0A2A.1. De hører ikke hjemme i manifestet til appen din.

## Deklarere personvernmanifestet i Expo

Med Expo skriver du ikke filen selv. Du beskriver den under `expo.ios.privacyManifests`, i app.json eller app.config, og prebuild genererer `PrivacyInfo.xcprivacy`. Det er metoden fra [Expos dokumentasjon om privacy manifests](https://docs.expo.dev/guides/apple-privacy/).

Her er det faktiske utdraget fra Solys-konfigurasjonen. Nøkkelen inneholder også sporing og innsamlede data, som er fjernet her:

```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 og 35F9.1 gjentar det React Native og Expo-modulene i appen deklarerer. 1C8F.1 kommer fra Solys selv: appen deler innstillinger med widgeten sin via en App Group.

En felle du bør kjenne til: hvis `ios`-mappen din er generert og ignorert av git, **havner en `PrivacyInfo.xcprivacy` du har skrevet for hånd i den mappen aldri i buildet.** EAS kjører prebuild på nytt og genererer mappen på nytt. Jeg så det i et av prosjektene mine 9. september 2026: det håndskrevne manifestet var borte etter en prebuild. Deklarasjonen må ligge i konfigurasjonen.

Siste punkt: manifestet er en del av binærfilen. En fjernoppdatering endrer det ikke. Du må lage et nytt build og sende det inn igjen.

## Tredjeparts-SDK-er med eget manifest

De fleste nyere biblioteker leverer sitt eget manifest. Expo-pakkene som bruker disse API-ene har en `PrivacyInfo.xcprivacy` i `ios`-mappen sin, akkurat som React Native. Problemet ligger i hvordan de lenkes til appen din.

Expo-dokumentasjonen advarer: Apple leser ikke alltid manifestene til statisk lenkede CocoaPods-avhengigheter riktig, og det gjelder Expo-pakkene. Du kan derfor måtte kopiere begrunnelsene deres inn i app-konfigurasjonen.

For å begrense jobben slår innstillingen `ios.privacyManifestAggregationEnabled` i [expo-build-properties](https://docs.expo.dev/versions/latest/sdk/build-properties/) sammen manifestene til CocoaPods-avhengighetene i én fil. I Podfilen Expo genererer i prosjektene mine (SDK 57) er denne sammenslåingen aktiv, med mindre du slår den av.

Sammenslåingen har en begrensning: den ser bare avhengigheter som har et manifest. Et gammelt bibliotek uten manifest forblir usynlig. **Les derfor filstien som nevnes i e-posten**: den forteller hvor du skal fikse.

| Fil som nevnes        | Hvor du fikser         |
| --------------------- | ---------------------- |
| Appens kjørbare fil   | `ios.privacyManifests` |
| Et `.framework`       | Oppdater SDK-et        |
| En utvidelse `.appex` | Utvidelsens manifest   |

## Sjekk før innsending

Expo foreslår å vente på e-posten fra Apple etter en innsending. Det funker, men hver runde koster et build. Her er de fire sjekkene jeg gjør først.

**1. List hva avhengighetene dine deklarerer.** Fra roten av prosjektet:

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

På Solys fant kommandoen 15. oktober 2026 13 manifester og fire kategorier: fildatoer, preferanser, tid siden oppstart og diskplass. Hver kategori i listen må finnes igjen i appens endelige manifest, eller i manifestet til frameworket som bruker den.

**2. Søk i din egen native kode.** Egne moduler, plugins, targets som en widget: den koden deklarerer ingen SDK for deg.

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

Tilpass mappene til prosjektet ditt. På Solys er det dette søket som avslører preferansene som deles via App Group, derav koden 1C8F.1.

**3. Les det genererte manifestet.** Kjør `npx expo prebuild -p ios`, og åpne `ios/<NavnPåAppenDin>/PrivacyInfo.xcprivacy`. Obs: denne kommandoen kan slette og gjenskape `ios`-mappen. Har du gjort endringer for hånd der, jobb på en kopi av prosjektet.

**4. Sjekk det endelige buildet.** Det er det eneste beviset som teller. Last ned IPA-en fra build-siden på expo.dev, og kjør på Macen din:

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

Den andre linjen lister alle innebygde manifester, appens og frameworkenes. Den tredje viser appens manifest, som du sammenligner med listen fra steg 1.

## Hva manifestet må si sammen med App Store-siden din

Manifestet står ikke alene. Hvis det deklarerer sporing eller innsamlede data, må App Store-siden og personvernerklæringen din si det samme. Et avvik mellom de tre kan senere koste deg en menneskelig avvisning etter [guideline 5.1.1](https://devoria.fr/no/blog/guideline-5-1-1-app-store-avvisning). Hva som må stemme overens, står i [personvernerklæring for en app](https://devoria.fr/no/blog/personvernerklaering-app-ios-guide).

## Send inn buildet uten ubehagelige overraskelser

ITMS-feil fikses raskt når du vet hvordan du leser dem. Avvisningene som kommer etterpå krever mer ettertanke: fremgangsmåten står på siden [app avvist av Apple](https://devoria.fr/no/expertise/app-avvist-av-apple), og de vanligste årsakene finner du i [hvorfor Apple avviser en app](https://devoria.fr/no/blog/avvist-av-apple-hvorfor-appen-blir-avvist).

For å sjekke prosjektet ditt før innsending samler [Apple Review Kit](https://devoria.fr/no/kits/review-apple) sjekklisten min og Claude Code-skills som går gjennom prosjektet ditt. Hvis innsendingen står fast og du vil ha et menneskelig blikk, [book en time med meg](https://devoria.fr/no/coaching): vi går gjennom prosjektet ditt på video, på skjermen din. Og forbereder du din første lansering, [ta den gratis diagnosen](https://devoria.fr/no/diagnostic): den setter stegene i riktig rekkefølge og sender deg sjekklisten min mot avvisning fra Apple.

## Ofte stilte spørsmål

### Blokkerer ITMS-91053 innsendingen av buildet mitt?

Apple skriver at App Store Connect siden 1. mai 2024 ikke godtar apper som ikke beskriver bruken av disse API-ene. Likevel har noen utviklere fått e-posten på et godtatt build, som en advarsel. Uansett: fiks manifestet før neste build.

### Hvilken begrunnelseskode skal jeg velge for UserDefaults?

CA92.1 hvis appen bare leser og skriver sine egne preferanser. Legg til 1C8F.1 hvis den deler dem med en widget eller utvidelse via en App Group. C56D.1 er forbeholdt tredjeparts-SDK-er: ikke legg den i appens manifest.

### Må jeg kopiere manifestet til hvert SDK inn i app.json?

Ikke nødvendigvis. Hvis sammenslåing av manifester er aktiv, samles manifestene til CocoaPods-avhengighetene når podene installeres. Kopier bare en kategori hvis den mangler i det endelige manifestet, med begrunnelsen som beskriver den faktiske bruken.

### Trenger widgeten eller utvidelsen min sitt eget manifest?

Ifølge Apple må hver bundle som inneholder en kjørbar fil som bruker disse API-ene, ha sitt eget manifest. En utvidelse er en egen kjørbar fil, i sin egen bundle: appens manifest dekker den ikke.

### Kan jeg fikse ITMS-91053 uten å lage et nytt build?

Nei. Personvernmanifestet er en del av binærfilen. Fiks konfigurasjonen, lag et nytt build, og test det i [TestFlight](https://devoria.fr/no/blog/testflight-teste-iphone-app-for-innsending) før du sender det til gjennomgang.


## Prosjektet ditt

[Apple Review Kit](https://devoria.fr/no/kits/review-apple): Sjekklisten jeg bruker for App Store-review, Apple-avslagene mine med rettelser, testernotater og to Claude Code-skills som gjennomgår appen din. 29 €.

[iOS Kit](https://devoria.fr/no/kits/ios): Lag iPhone-appen din med Claude Code: startkoden til appene mine, skills som sjekker arbeidet, og Apple Review Kit, App Store Screenshots Kit og ASO Kit. 129,99 €.
