# ITMS-91053: διόρθωση «Missing API declaration» στο Expo

> ITMS-91053: το build σου χρησιμοποιεί API με υποχρεωτικό λόγο χωρίς δήλωση. Βάλε κατηγορία και κωδικό στο ios.privacyManifests και κάνε νέο build.

Αρχική σελίδα: [ITMS-91053: διόρθωση «Missing API declaration» στο Expo](https://devoria.fr/el/blog/itms-91053-missing-api-declaration-expo)
Συγγραφέας: [Mehdi Azizi](https://devoria.fr/el/mehdi-azizi)
Δημοσίευση: 2026-10-25
Τελευταία αναθεώρηση περιεχομένου: 2026-10-25


ITMS-91053 είναι ένας αυτόματος έλεγχος της Apple, που σου έρχεται με e-mail μετά την [αποστολή του build σου](https://devoria.fr/el/blog/eas-submit-ios-publish-expo-app-store). Λέει ότι ο κώδικας της εφαρμογής σου χρησιμοποιεί ένα API «με υποχρεωτικό λόγο» (προτιμήσεις, ημερομηνίες αρχείων, χρόνος από την εκκίνηση, χώρος στον δίσκο ή πληκτρολόγια) χωρίς να εξηγεί γιατί στο manifest απορρήτου της. **Με το Expo, η διόρθωση γίνεται στο `ios.privacyManifests`: η κατηγορία που αναφέρει η Apple, ο κωδικός που περιγράφει την πραγματική σου χρήση, και μετά ένα νέο build.**

Στο Solys, το ξυπνητήρι μου με μίνι παιχνίδια, αυτοί οι λόγοι δηλώνονται στη ρύθμιση της εφαρμογής. Παρακάτω θα βρεις την πραγματική του δήλωση, την εντολή που δείχνει τι χρησιμοποιούν οι εξαρτήσεις σου, και τον έλεγχο που κάνεις στο τελικό αρχείο πριν την αποστολή.

## Τι σημαίνει το σφάλμα ITMS-91053;

Το μήνυμα έχει τίτλο «ITMS-91053: Missing API declaration». Λέει ότι ο κώδικας ενός συγκεκριμένου αρχείου του build σου αναφέρεται σε ένα ή περισσότερα API που απαιτούν λόγο. Μετά απαριθμεί τις κατηγορίες που εμπλέκονται, για παράδειγμα `NSPrivacyAccessedAPICategoryUserDefaults`.

Αυτά τα API δεν ζητούν καμία άδεια από τον χρήστη. Μπορούν όμως να χρησιμοποιηθούν για να αναγνωριστεί μια συσκευή, αυτό που η Apple λέει fingerprinting. Αυτό απαγορεύεται, ακόμα κι όταν ο χρήστης αποδέχεται την παρακολούθηση. Η Apple το εξηγεί στη σελίδα της για τα [API με υποχρεωτικό λόγο](https://developer.apple.com/documentation/bundleresources/describing-use-of-required-reason-api): κάθε εφαρμογή και κάθε SDK πρέπει να δηλώνει γιατί τα χρησιμοποιεί.

Η ίδια σελίδα ορίζει τον κανόνα: **από την 1η Μαΐου 2024, το App Store Connect δεν δέχεται πλέον εφαρμογή που δεν περιγράφει αυτές τις χρήσεις στο manifest της.** Κάποιοι developers ανέφεραν αυτό το e-mail ως απλή προειδοποίηση, σε build που έγινε δεκτό. Μην βασίζεσαι σε αυτό: αντιμετώπισέ το ως μπλοκάρισμα και διόρθωσε πριν την επόμενη αποστολή.

Όπως και τα άλλα σφάλματα ITMS, δεν είναι απόρριψη από reviewer. Κανείς δεν άνοιξε την εφαρμογή σου: η Apple ανέλυσε το binary.

## Το privacy manifest του iOS: το αρχείο PrivacyInfo.xcprivacy

Το manifest απορρήτου είναι ένα αρχείο με όνομα `PrivacyInfo.xcprivacy`, τοποθετημένο στη ρίζα του bundle της εφαρμογής. Σύμφωνα με την [τεκμηρίωση της Apple για τα privacy manifests](https://developer.apple.com/documentation/bundleresources/privacy-manifest-files), περιγράφει τα δεδομένα που συλλέγονται, την παρακολούθηση και τα API με υποχρεωτικό λόγο. Αυτά τα τελευταία μπαίνουν στον πίνακα `NSPrivacyAccessedAPITypes`: μία εγγραφή ανά κατηγορία, με τον τύπο της και τη λίστα των λόγων της.

Η παγίδα: **ένα manifest καλύπτει μόνο το δικό του bundle.** Η Apple το γράφει: κάθε εκτελέσιμο ή δυναμική βιβλιοθήκη που χρησιμοποιεί αυτά τα API πρέπει να έχει manifest στο bundle της. Αυτό της εφαρμογής σου δεν καλύπτει ένα ενσωματωμένο framework, και ένα SDK δεν μπορεί να βασιστεί σε αυτό της εφαρμογής σου.

Μην το μπερδεύεις με τις φράσεις του Info.plist που απαιτεί το [ITMS-90683](https://devoria.fr/el/blog/itms-90683-missing-purpose-string-expo). Εκείνες εμφανίζονται στον χρήστη σε ένα αίτημα άδειας. Το manifest το διαβάζει μόνο η Apple.

## Οι 5 κατηγορίες API και οι κωδικοί λόγου τους

Το πλήρες όνομα μιας κατηγορίας ξεκινά με `NSPrivacyAccessedAPICategory`. Η λίστα των API και των λόγων βρίσκεται στη σελίδα του κλειδιού [NSPrivacyAccessedAPIType](https://developer.apple.com/documentation/bundleresources/app-privacy-configuration/nsprivacyaccessedapitypes/nsprivacyaccessedapitype), που διάβασα στις 15 Οκτωβρίου 2026.

| Κατηγορία       | Τυπικό API                   | Συνηθισμένος λόγος |
| --------------- | ---------------------------- | ------------------ |
| UserDefaults    | `UserDefaults`               | CA92.1             |
| FileTimestamp   | `creationDate`               | C617.1             |
| SystemBootTime  | `systemUptime`               | 35F9.1             |
| DiskSpace       | `volumeAvailableCapacityKey` | E174.1             |
| ActiveKeyboards | `activeInputModes`           | 54BD.1             |

Οι κωδικοί που θα συναντήσεις πιο συχνά:

- **CA92.1**: η εφαρμογή διαβάζει και γράφει τις δικές της προτιμήσεις, που δεν είναι προσβάσιμες σε άλλες εφαρμογές.
- **1C8F.1**: προτιμήσεις κοινές με ένα widget ή ένα extension του ίδιου App Group.
- **C617.1**: ημερομηνίες ή μέγεθος αρχείων που βρίσκονται στο container της εφαρμογής.
- **3B52.1**: αρχεία που επέλεξε ο χρήστης, για παράδειγμα σε έναν επιλογέα εγγράφων.
- **35F9.1**: μέτρηση του χρόνου ανάμεσα σε δύο γεγονότα της εφαρμογής, ή λειτουργία χρονομέτρου.
- **E174.1**: έλεγχος του ελεύθερου χώρου πριν γραφτούν αρχεία, με ορατό αποτέλεσμα για τον χρήστη.
- **85F4.1**: εμφάνιση του χώρου στον δίσκο στον χρήστη.

**Δήλωσε τον λόγο που αντιστοιχεί στην πραγματική σου χρήση, όχι αυτόν που μοιάζει πιο γενικός.** Η Apple διευκρινίζει ότι αυτά τα API και τα δεδομένα τους χρησιμοποιούνται μόνο για τους δηλωμένους λόγους, και ποτέ για παρακολούθηση. Δύο κωδικοί προορίζονται για SDK τρίτων: C56D.1 και 0A2A.1. Δεν έχουν θέση στο manifest της εφαρμογής σου.

## Δήλωση του privacy manifest στο Expo

Με το Expo, δεν γράφεις το αρχείο μόνος σου. Το περιγράφεις κάτω από το `expo.ios.privacyManifests`, στο app.json ή στο app.config, και το prebuild δημιουργεί το `PrivacyInfo.xcprivacy`. Αυτή είναι η μέθοδος της [τεκμηρίωσης του Expo για τα privacy manifests](https://docs.expo.dev/guides/apple-privacy/).

Ορίστε το πραγματικό απόσπασμα από τη ρύθμιση του Solys. Το κλειδί περιέχει επίσης την παρακολούθηση και τα συλλεγόμενα δεδομένα, που αφαίρεσα εδώ:

```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 και 35F9.1 επαναλαμβάνουν ό,τι δηλώνουν το React Native και τα modules του Expo της εφαρμογής. Ο 1C8F.1 προέρχεται από το ίδιο το Solys: η εφαρμογή μοιράζεται ρυθμίσεις με το widget της μέσω ενός App Group.

Μια παγίδα που πρέπει να ξέρεις: αν ο φάκελος `ios` σου δημιουργείται αυτόματα και αγνοείται από το git, **ένα `PrivacyInfo.xcprivacy` γραμμένο με το χέρι σε αυτόν τον φάκελο δεν φτάνει ποτέ στο build.** Το EAS ξανατρέχει το prebuild και δημιουργεί ξανά τον φάκελο. Το διαπίστωσα σε ένα από τα projects μου στις 9 Σεπτεμβρίου 2026: το manifest που είχα γράψει με το χέρι είχε εξαφανιστεί μετά από ένα prebuild. Η δήλωση πρέπει να βρίσκεται στη ρύθμιση.

Τελευταίο σημείο: το manifest είναι μέρος του binary. Μια απομακρυσμένη ενημέρωση δεν το αλλάζει. Πρέπει να κάνεις νέο build και να το ξαναστείλεις.

## Τα SDK τρίτων που έχουν το δικό τους manifest

Οι περισσότερες πρόσφατες βιβλιοθήκες παρέχουν το manifest τους. Τα πακέτα Expo που χρησιμοποιούν αυτά τα API έχουν ένα `PrivacyInfo.xcprivacy` στον φάκελο `ios` τους, όπως και το React Native. Το πρόβλημα είναι ο τρόπος με τον οποίο συνδέονται με την εφαρμογή σου.

Η τεκμηρίωση του Expo προειδοποιεί: η Apple δεν διαβάζει σωστά όλα τα manifests των εξαρτήσεων CocoaPods που συνδέονται στατικά, όπως συμβαίνει με τα πακέτα Expo. Μπορεί λοιπόν να χρειαστεί να αντιγράψεις τους λόγους τους στη ρύθμιση της εφαρμογής σου.

Για να περιορίσεις αυτή τη δουλειά, η ρύθμιση `ios.privacyManifestAggregationEnabled` του [expo-build-properties](https://docs.expo.dev/versions/latest/sdk/build-properties/) συγχωνεύει τα manifests των εξαρτήσεων CocoaPods σε ένα μόνο αρχείο. Στο Podfile που δημιουργεί το Expo στα projects μου (SDK 57), αυτή η συγχώνευση είναι ενεργή, εκτός αν την απενεργοποιήσεις.

Η συγχώνευση έχει ένα όριο: βλέπει μόνο τις εξαρτήσεις που παρέχουν manifest. Μια παλιά βιβλιοθήκη χωρίς manifest μένει αόρατη. **Διάβασε λοιπόν τη διαδρομή του αρχείου που αναφέρει το e-mail**: σου λέει πού να διορθώσεις.

| Αρχείο που αναφέρεται       | Πού διορθώνεις         |
| --------------------------- | ---------------------- |
| Το εκτελέσιμο της εφαρμογής | `ios.privacyManifests` |
| Ένα `.framework`            | Ενημέρωσε το SDK       |
| Ένα extension `.appex`      | Manifest του extension |

## Έλεγχος πριν την αποστολή

Το Expo προτείνει να περιμένεις το e-mail της Apple μετά από μια αποστολή. Δουλεύει, αλλά κάθε πήγαινε-έλα κοστίζει ένα build. Ορίστε οι τέσσερις έλεγχοι που κάνω πριν.

**1. Δες τι δηλώνουν οι εξαρτήσεις σου.** Από τη ρίζα του project:

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

Στο Solys, στις 15 Οκτωβρίου 2026, η εντολή βρίσκει 13 manifests και τέσσερις κατηγορίες: ημερομηνίες αρχείων, προτιμήσεις, χρόνο από την εκκίνηση και χώρο στον δίσκο. Κάθε κατηγορία της λίστας πρέπει να υπάρχει στο τελικό manifest της εφαρμογής, ή σε αυτό του framework που τη χρησιμοποιεί.

**2. Ψάξε στον δικό σου native κώδικα.** Δικά σου modules, plugins, targets όπως ένα widget: αυτόν τον κώδικα κανένα SDK δεν τον δηλώνει για σένα.

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

Προσάρμοσε τους φακέλους στο project σου. Στο Solys, αυτή η αναζήτηση είναι που αποκαλύπτει τις προτιμήσεις που μοιράζονται μέσω App Group, γι' αυτό και ο κωδικός 1C8F.1.

**3. Διάβασε το manifest που δημιουργήθηκε.** Τρέξε `npx expo prebuild -p ios` και μετά άνοιξε το `ios/<YourAppName>/PrivacyInfo.xcprivacy`. Προσοχή: αυτή η εντολή μπορεί να διαγράψει και να ξαναδημιουργήσει τον φάκελο `ios`. Αν έχεις κάνει εκεί αλλαγές με το χέρι, δούλεψε σε αντίγραφο του project.

**4. Έλεγξε το τελικό build.** Είναι η μόνη απόδειξη που μετράει. Κατέβασε το IPA από τη σελίδα του build στο expo.dev και τρέξε στο Mac σου:

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

Η δεύτερη γραμμή δείχνει όλα τα ενσωματωμένα manifests, της εφαρμογής και των frameworks. Η τρίτη εμφανίζει αυτό της εφαρμογής, για να το συγκρίνεις με τη λίστα του βήματος 1.

## Τι πρέπει να λέει το manifest σε σχέση με τη σελίδα σου

Το manifest δεν ζει μόνο του. Αν δηλώνει παρακολούθηση ή συλλεγόμενα δεδομένα, η σελίδα σου στο App Store και η πολιτική απορρήτου σου πρέπει να λένε το ίδιο. Μια ασυμφωνία ανάμεσα στα τρία μπορεί αργότερα να σου κοστίσει απόρριψη από άνθρωπο, βάσει της [guideline 5.1.1](https://devoria.fr/el/blog/guideline-5-1-1-aporripsi-app-store). Τι πρέπει να ευθυγραμμίσεις εξηγείται αναλυτικά στο [πολιτική απορρήτου μιας εφαρμογής](https://devoria.fr/el/blog/politiki-aporritou-efarmogis-ios).

## Στείλε το build σου χωρίς δυσάρεστες εκπλήξεις

Τα σφάλματα ITMS διορθώνονται γρήγορα όταν ξέρεις να τα διαβάζεις. Οι απορρίψεις που έρχονται μετά θέλουν περισσότερη ψυχραιμία: η διαδικασία είναι στη σελίδα [εφαρμογή που απέρριψε η Apple](https://devoria.fr/el/expertise/app-rejected-by-apple), και οι πιο συχνοί λόγοι στο [γιατί η Apple απορρίπτει μια εφαρμογή](https://devoria.fr/el/blog/aporripsi-app-apple-app-store-aities).

Για να ελέγξεις τον φάκελό σου πριν την αποστολή, το [Apple Review Kit](https://devoria.fr/el/kits/review-apple) περιέχει τη checklist μου και skills του Claude Code που ελέγχουν το project σου. Αν η αποστολή σου κολλάει και θέλεις ανθρώπινη ματιά, [κλείσε μια ώρα μαζί μου](https://devoria.fr/el/coaching): δουλεύουμε το project σου σε βιντεοκλήση, στην οθόνη σου. Κι αν ετοιμάζεις την πρώτη σου κυκλοφορία, [κάνε τη δωρεάν διάγνωση](https://devoria.fr/el/diagnostic): βάζει τα βήματα στη σειρά και σου στέλνει τη checklist μου κατά των απορρίψεων της Apple.

## Συχνές ερωτήσεις

### Μπλοκάρει το ITMS-91053 την αποστολή του build μου;

Η Apple γράφει ότι από την 1η Μαΐου 2024 το App Store Connect δεν δέχεται πλέον εφαρμογές που δεν περιγράφουν τη χρήση αυτών των API. Ωστόσο κάποιοι developers έλαβαν το e-mail σε build που έγινε δεκτό, ως προειδοποίηση. Σε κάθε περίπτωση, διόρθωσε το manifest πριν το επόμενο build.

### Ποιον κωδικό λόγου να διαλέξω για το UserDefaults;

Τον CA92.1 αν η εφαρμογή διαβάζει και γράφει μόνο τις δικές της προτιμήσεις. Πρόσθεσε τον 1C8F.1 αν τις μοιράζεται με ένα widget ή ένα extension μέσω App Group. Ο C56D.1 προορίζεται για SDK τρίτων: μην τον βάλεις στο manifest της εφαρμογής σου.

### Πρέπει να αντιγράψω το manifest κάθε SDK στο app.json;

Όχι απαραίτητα. Αν η συγχώνευση των manifests είναι ενεργή, αυτά των εξαρτήσεων CocoaPods ενώνονται κατά την εγκατάσταση των pods. Αντίγραψε μια κατηγορία μόνο αν λείπει από το τελικό manifest, με τον λόγο που περιγράφει την πραγματική χρήση.

### Χρειάζεται το widget ή το extension μου δικό του manifest;

Σύμφωνα με την Apple, κάθε bundle που περιέχει εκτελέσιμο που χρησιμοποιεί αυτά τα API πρέπει να έχει δικό του manifest. Ένα extension είναι ξεχωριστό εκτελέσιμο, στο δικό του bundle: το manifest της εφαρμογής δεν το καλύπτει.

### Μπορώ να διορθώσω το ITMS-91053 χωρίς νέο build;

Όχι. Το manifest απορρήτου είναι μέρος του binary. Διόρθωσε τη ρύθμιση, κάνε νέο build και δοκίμασέ το στο [TestFlight](https://devoria.fr/el/blog/testflight-dokimi-efarmogis-iphone) πριν το στείλεις για review.


## Το project σου

[Apple Review Kit](https://devoria.fr/el/kits/review-apple): Η checklist για το App Store review που χρησιμοποιώ, οι απορρίψεις μου από την Apple διορθωμένες, οι σημειώσεις για τον reviewer και δύο skills του Claude Code που ελέγχουν την app σου. 29 €.

[iOS Kit](https://devoria.fr/el/kits/ios): Φτιάξε την app σου για iPhone με το Claude Code: ο κώδικας εκκίνησης των apps μου, τα skills που ελέγχουν τη δουλειά του, και τα Apple Review Kit, App Store Screenshots Kit και ASO Kit. 129,99 €.
