# Guideline 2.5.4: η Apple απορρίπτει background mode

> Guideline 2.5.4: η Apple απορρίπτει background mode που δηλώνεται χωρίς λειτουργία που το χρησιμοποιεί. Αφαίρεσε το κλειδί ή δείξε τον ήχο, τη θέση ή την κλήση.

Αρχική σελίδα: [Guideline 2.5.4: η Apple απορρίπτει background mode](https://devoria.fr/el/blog/guideline-2-5-4-background-mode-rejected-apple)
Συγγραφέας: [Mehdi Azizi](https://devoria.fr/el/mehdi-azizi)
Δημοσίευση: 2026-11-04
Τελευταία αναθεώρηση περιεχομένου: 2026-11-04


Η guideline 2.5.4 περιορίζει τα background modes στη χρήση για την οποία υπάρχουν: ήχος, τοποθεσία, κλήσεις VoIP, ολοκλήρωση εργασίας, τοπικές ειδοποιήσεις. Η απόρριψη έρχεται όταν το Info.plist σου δηλώνει ένα από αυτά τα modes και ο reviewer δεν βρίσκει καμία λειτουργία που να το χρειάζεται. **Αφαίρεσε το κλειδί αν δεν το χρησιμοποιεί τίποτα, αλλιώς δείξε τη λειτουργία στον reviewer σε τριάντα δευτερόλεπτα.**

Δημοσιεύω τις δικές μου iOS apps με Expo. Το Solys, το ξυπνητήρι μου με mini-games, δηλώνει το audio mode: το αφαίρεσα και μετά το ξαναέβαλα για άλλο λόγο. Αυτός ο οδηγός βασίζεται στο κείμενο της Apple, σε απορρίψεις που έχουν δημοσιεύσει άλλοι developers και στα δικά μου projects. Για τη συνολική εικόνα των λόγων απόρριψης, διάβασε [γιατί η Apple απορρίπτει μια app](https://devoria.fr/el/blog/aporripsi-app-apple-app-store-aities).

## Τι λέει η guideline 2.5.4;

Ο κανόνας χωράει σε μία πρόταση, στην ενότητα 2 «Performance», υποενότητα 2.5 «Software Requirements», των [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#2.5.4): «Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc.»

Με απλά λόγια: μια υπηρεσία παρασκηνίου χρησιμεύει μόνο σε αυτό για το οποίο υπάρχει. Γι' αυτό και ο τίτλος «Guideline 2.5.4 - Performance - Software Requirements».

Από προεπιλογή, μια app που πάει στο παρασκήνιο τίθεται σε αναστολή. Για να συνεχίσει να τρέχει, δηλώνει ένα ή περισσότερα modes στο κλειδί `UIBackgroundModes` του Info.plist της. Η [τεκμηρίωση της Apple για τα background modes](https://developer.apple.com/documentation/xcode/configuring-background-execution-modes) ζητά να τα χρησιμοποιείς με φειδώ, λόγω μπαταρίας, και να προτιμάς άλλη λύση όταν υπάρχει. **Κάθε δηλωμένο mode είναι μια υπόσχεση που ο reviewer μπορεί να ελέγξει.**

## Τα background modes και η προβλεπόμενη χρήση τους

| Mode                  | Κλειδί                | Προβλεπόμενη χρήση           |
| --------------------- | --------------------- | ---------------------------- |
| Audio, AirPlay, PiP   | `audio`               | Ακουστός ήχος στο παρασκήνιο |
| Τοποθεσία             | `location`            | Συνεχής τοποθεσία            |
| Voice over IP         | `voip`                | Κλήσεις με CallKit           |
| Background fetch      | `fetch`               | Τακτικό περιεχόμενο δικτύου  |
| Background processing | `processing`          | Προγραμματισμένες εργασίες   |
| Remote notifications  | `remote-notification` | Push για νέο περιεχόμενο     |

Ο πίνακας συνοψίζει τη σελίδα της Apple. Στις απορρίψεις που δημοσιεύονται στα forums, τα `audio`, `location` και `voip` εμφανίζονται πιο συχνά.

## Τι σημαίνει το μήνυμα απόρριψης 2.5.4;

Το μήνυμα κατονομάζει το mode που φταίει. Δύο παραδείγματα που δημοσίευσαν developers στα forums της Apple:

- **Audio**: «Your app still declares support for audio in the UIBackgroundModes key in your Info.plist but did not include features that require persistent audio.» Η συνέχεια διευκρινίζει ότι το κλειδί `audio` είναι για apps που αναπαράγουν ακουστό περιεχόμενο στο παρασκήνιο, όπως ένας music player. Προτείνει δύο λύσεις: να προσθέσεις τέτοιο περιεχόμενο ή να αφαιρέσεις το κλειδί ([thread στο forum](https://developer.apple.com/forums/thread/95216)).
- **Τοποθεσία**: σε ένα [thread του Δεκεμβρίου 2024](https://developer.apple.com/forums/thread/771202), η Apple δεν βρήκε καμία λειτουργία, εκτός από την παρακολούθηση υπαλλήλων, που να απαιτεί μόνιμη τοποθεσία, και γράφει ότι αυτή η χρήση από μόνη της δεν είναι κατάλληλη.

Όπως το διαβάζω εγώ: **ο reviewer δεν διαβάζει τον κώδικά σου, ψάχνει μια λειτουργία.** Πρέπει να μπορεί να την ξεκινήσει, να στείλει την app στο παρασκήνιο και να δει ότι συνεχίζει.

Υπάρχει και η αντίθετη περίπτωση. Σε ένα [thread του Μαΐου 2026](https://developer.apple.com/forums/thread/826849), μια app ανάγνωσης φωναχτά, που χρησιμοποιούσε πραγματικά το mode `audio`, απορρίφθηκε αρκετές φορές: ο reviewer δεν κατάφερνε να ενεργοποιήσει τον ήχο. Ένας άλλος developer γράφει εκεί ότι, κατά τη γνώμη του, ένα συνημμένο βίντεο ξεμπλόκαρε τη δική του περίπτωση. Είναι μαρτυρία, όχι κανόνας της Apple.

## Από πού έρχεται το κλειδί αν δεν το πρόσθεσες εσύ;

Με το Expo, τα config plugins γεμίζουν το Info.plist κατά το prebuild. **Ένα background mode μπορεί λοιπόν να μπει στο binary σου χωρίς να το έχεις αποφασίσει.**

### Το plugin expo-audio με τις προεπιλεγμένες ρυθμίσεις

Η [τεκμηρίωση του expo-audio](https://docs.expo.dev/versions/latest/sdk/audio/) το λέει ξεκάθαρα: η επιλογή `enableBackgroundPlayback` είναι `true` από προεπιλογή και, στο iOS, προσθέτει το mode `audio`. Αρκεί λοιπόν να δηλώσεις το plugin στη σύντομη μορφή του, `"expo-audio"`, για να δηλωθεί και το mode.

Αυτό βρήκα ξαναδιαβάζοντας το TradaZen πριν την πρώτη υποβολή: σύντομοι ήχοι interface στο προσκήνιο, αλλά ένα plugin δηλωμένο σε σύντομη μορφή. Η διόρθωση χωράει στο `app.json`:

```json
{
  "expo": {
    "plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
  }
}
```

Άλλα πακέτα προσθέτουν mode με τον δικό τους τρόπο. Η επιλογή `isIosBackgroundLocationEnabled` του [expo-location](https://docs.expo.dev/versions/latest/sdk/location/) προσθέτει το `location` μόνο αν την ενεργοποιήσεις. Το [expo-background-task](https://docs.expo.dev/versions/latest/sdk/background-task/), αντίθετα, προσθέτει το `processing` στο prebuild μόλις εγκατασταθεί.

### Ο φάκελος ios/ που κρατά το παλιό κλειδί

Δεύτερη παγίδα, που την έζησα με το Solys τον Ιούλιο του 2026. Είχα αφαιρέσει το `audio` από το `app.json`, αλλά το κλειδί έμενε στο `ios/Solys/Info.plist`, που είχε δημιουργηθεί νωρίτερα. Ένα prebuild χωρίς `--clean` τροποποιεί αυτό το project αντί να το ξαναφτιάξει, και το plugin προσθέτει το κλειδί χωρίς να το αφαιρεί ποτέ. Ένα τοπικό build θα το είχε ενσωματώσει. Ένα EAS build στο cloud ξεκινά από καινούργιο prebuild όταν το `ios/` αγνοείται από το git, που ήταν και η δική μου περίπτωση.

Πριν από κάθε build, ελέγχω τι θα φύγει στην πραγματικότητα:

```bash
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
```

Η πρώτη εντολή εμφανίζει τα modes που θα γράψει το prebuild στο Info.plist. Η δεύτερη ξαναφτιάχνει το native project για τοπικό build, σβήνοντας τον φάκελο `ios/`. Στο Solys, η πρώτη δείχνει `"UIBackgroundModes":["audio"]`, στο TradaZen τίποτα: και τα δύο είναι σκόπιμα.

Η προσθήκη ή αφαίρεση ενός mode αλλάζει το Info.plist, άρα και το binary: **χρειάζεται νέο build, ένα remote update δεν αρκεί.** Η [τεκμηρίωση του EAS Update](https://docs.expo.dev/eas-update/introduction/) κατατάσσει αυτές τις αλλαγές σε όσες απαιτούν νέο binary, όπως και για το [ITMS-90683](https://devoria.fr/el/blog/itms-90683-missing-purpose-string-expo).

## Solys: ένα audio mode δηλωμένο για πραγματικό λόγο

Το Solys είναι ξυπνητήρι, αλλά το mode `audio` δεν χρησιμεύει για να χτυπήσει το ξυπνητήρι: **ο ήχος του ξυπνητηριού περνά από το AlarmKit**, την υπηρεσία ξυπνητηριού της Apple που υπάρχει από το iOS 26 ([τεκμηρίωση AlarmKit](https://developer.apple.com/documentation/alarmkit)). Χτυπά το σύστημα, ακόμα και στο αθόρυβο, όχι η app.

Το ιστορικό του κλειδιού, γιατί η σκέψη μετράει περισσότερο από τη γραμμή:

1. **Τέλη Ιουλίου 2026, το αφαιρώ.** Τίποτα δεν έπαιζε ήχο στο παρασκήνιο: τα ηχητικά εφέ των mini-games μένουν στο προσκήνιο και το ξυπνητήρι δεν εξαρτάται από την app.
2. **Δύο μέρες μετά, το ξαναβάζω**, μαζί με την παρακολούθηση της νύχτας. Αυτή η επιλογή ηχογραφεί τους θορύβους της νύχτας σου με το μικρόφωνο και τους αναλύει πάνω στο iPhone. Η ηχογράφηση πρέπει να συνεχίζεται με κλειδωμένη οθόνη, και η τεκμηρίωση του expo-audio αναφέρει ότι και η επιλογή ηχογράφησης στο παρασκήνιο προσθέτει το mode `audio`.

Η αιτιολόγηση άλλαξε φύση: **το mode χρησιμεύει για ηχογράφηση, όχι για αναπαραγωγή.** Τρεις δικλίδες ασφαλείας, ορατές μέσα στην app:

- η παρακολούθηση είναι επιλογή απενεργοποιημένη από προεπιλογή, που ενεργοποιείται από τις ρυθμίσεις ή από τη βραδινή ρουτίνα,
- έχει δική της οθόνη συγκατάθεσης, όπως απαιτεί ο [κανόνας 2.5.14](https://developer.apple.com/app-store/review/guidelines/#2.5.14) για κάθε ηχογράφηση, και τίποτα δεν φεύγει από το τηλέφωνο,
- το μικρόφωνο κλείνει δέκα λεπτά πριν το ξυπνητήρι, ώστε η παρακολούθηση και ο ήχος του ξυπνητηριού να μην ενοχλούνται ποτέ μεταξύ τους.

Δεν μπορώ να εγγυηθώ ότι ένας reviewer θα δέχεται πάντα αυτή τη δήλωση. Ξέρω όμως να πω, για κάθε στοιχείο, σε τι χρησιμεύει και πού φαίνεται.

### Τα ξυπνητήρια που κρατούσαν την app ξύπνια

Πριν το AlarmKit, ένα τρίτο ξυπνητήρι δεν μπορούσε να χτυπήσει όπως το ξυπνητήρι της Apple. Κάποιες βιβλιοθήκες λοιπόν κρατούσαν την app ξύπνια: η τεκμηρίωση του Flutter πακέτου [alarm2](https://pub.dev/packages/alarm2) περιγράφει έναν σιωπηλό audio player που τρέχει μέχρι το ξυπνητήρι. Όμως ένας βουβός ήχος δεν ακούγεται. **Από το iOS 26, το AlarmKit κάνει αυτή την παράκαμψη περιττή.**

## Κρατάς ή αφαιρείς το mode: ο πίνακας απόφασης

| Η περίπτωσή σου             | Τι κάνεις               |
| --------------------------- | ----------------------- |
| Σύντομοι ήχοι στο προσκήνιο | Αφαιρείς το `audio`     |
| Μουσική ή audiobook         | Το κρατάς, το δείχνεις  |
| Μεγάλη ηχογράφηση           | Το κρατάς + συγκατάθεση |
| Ξυπνητήρι ή χρονόμετρο      | AlarmKit (iOS 26)       |
| Τοποθεσία που και που       | Significant changes     |
| Συγχρονισμός χωρίς βιασύνη  | `fetch` ή `processing`  |
| Κλήσεις ήχου ή βίντεο       | `voip` με CallKit       |

Για την τοποθεσία, η σελίδα της Apple αναφέρει την υπηρεσία significant location changes ως εναλλακτική στο mode `location`.

## Οι άλλες παράγραφοι της 2.5: 2.5.1 και 2.5.2

### 2.5.1: δημόσια APIs και frameworks στη θέση τους

«Apps may only use public APIs and must run on the currently shipping OS.» Η app χρησιμοποιεί μόνο δημόσια APIs, τρέχει στην τρέχουσα έκδοση του συστήματος και εγκαταλείπει ό,τι είναι deprecated. Όπως και στην 2.5.4, κάθε framework χρησιμεύει για την προβλεπόμενη χρήση του, που αναφέρεται στην περιγραφή: HealthKit για την υγεία, HomeKit για το έξυπνο σπίτι. Αν μια βιβλιοθήκη καλεί ιδιωτικό API, η απόρριψη πέφτει στη δική σου app.

### 2.5.2: όχι κατεβασμένος κώδικας που αλλάζει την app

Η app μένει αυτόνομη μέσα στο πακέτο της. Δεν μπορεί να «download, install, or execute code which introduces or changes features or functionality of the app». Μόνο οι εκπαιδευτικές apps που διδάσκουν προγραμματισμό έχουν περιορισμένη εξαίρεση, με κώδικα πλήρως ορατό και τροποποιήσιμο από τον χρήστη.

Με το Expo, το ζήτημα αφορά το EAS Update, του οποίου η τεκμηρίωση υπενθυμίζει ότι τα updates πρέπει να σέβονται τους κανόνες του App Store. **Κράτα τα remote updates για διορθώσεις, ποτέ για να παραδώσεις λειτουργία που ο reviewer δεν έχει δει.** Μια διόρθωση που σχετίζεται με το review περνά από νέο build, όπως εξηγώ στον οδηγό της [guideline 2.1](https://devoria.fr/el/blog/guideline-2-1-app-store-rejection-fix).

## Πώς απαντάς σε απόρριψη 2.5.4;

Η συζήτηση γίνεται στην ενότητα App Review της app σου, όπου [απαντάς στο μήνυμα του App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/). Δύο περιπτώσεις:

- **Το mode δεν χρησιμεύει σε τίποτα**: αφαίρεσέ το, κάνε νέο build, έλεγξε το introspection και μετά απάντησε σε δύο προτάσεις.
- **Το mode εξυπηρετεί πραγματική λειτουργία**: απάντησε με την ακριβή διαδρομή και ένα σύντομο βίντεο, και μετά βάλε το ίδιο κείμενο στα review notes κάθε έκδοσης.

Το πρότυπο που θα χρησιμοποιούσα, για προσαρμογή (αφαίρεσε την πρόταση για το ξυπνητήρι αν η app σου δεν έχει):

```text
Hello,

The "audio" background mode is used only by [feature], an
optional feature that [records / plays] audio while the
device is locked. It is off by default.

How to test:
1. Open [screen] and turn on [feature].
2. Accept the microphone permission if asked.
3. Tap [button], then lock the device.
   [What the reviewer will hear or see.]

Our alarm does not use this mode: it is scheduled with
AlarmKit and rings through the system.

Attached: a short screen recording of these steps.

Best regards,
```

## Η checklist 2.5.4 πριν την υποβολή

- Το introspection του Expo δείχνει μόνο τα modes που θέλεις, και ξέρεις να κατονομάσεις τη λειτουργία του καθενός.
- Κανένα plugin δεν δηλώνεται σε σύντομη μορφή αν προσθέτει mode από προεπιλογή, όπως το expo-audio.
- Ο τοπικός σου φάκελος `ios/` δεν κρατά κανένα παλιό κλειδί, ή κάνεις build από καθαρό prebuild.
- Η λειτουργία ενεργοποιείται γρήγορα, χωρίς κρυφή ρύθμιση, και τα review notes λένε ποιο mode χρησιμεύει σε τι και πώς δοκιμάζεται.
- Κάθε ηχογράφηση ζητά ρητή συγκατάθεση και εμφανίζει ορατή ένδειξη. Οι κανόνες για τα αιτήματα αδειών είναι στον οδηγό της [guideline 5.1.1](https://devoria.fr/el/blog/guideline-5-1-1-aporripsi-app-store).
- Για ξυπνητήρι, ο ήχος περνά από το AlarmKit, όχι από ήχο που παίζει η app.

## Έλεγξε τον φάκελό σου πριν την αποστολή

Το [Review Kit](https://devoria.fr/el/kits/app-review) συγκεντρώνει τη checklist μου πριν την αποστολή, πρότυπα σημειώσεων για τον tester και skills του Claude Code που ξαναδιαβάζουν το project σου. Για ανθρώπινη ματιά, [κλείσε μια ώρα μαζί μου](https://devoria.fr/el/coaching): διαβάζουμε μαζί το μήνυμα της Apple και το Info.plist σου, σε βιντεοκλήση. Όλη η διαδικασία είναι στη σελίδα [app που απορρίφθηκε από την Apple](https://devoria.fr/el/expertise/app-rejected-by-apple).

Ετοιμάζεις την πρώτη σου κυκλοφορία; [Κάνε το δωρεάν διαγνωστικό](https://devoria.fr/el/diagnostic): βάζει τα βήματα στη σωστή σειρά και σου στέλνει τη checklist μου κατά των απορρίψεων της Apple.

Κανείς δεν μπορεί να εγγυηθεί ότι η Apple θα δεχτεί την app σου. Ένα καλά αιτιολογημένο background mode, όμως, υπερασπίζεται τον εαυτό του σε τριάντα δευτερόλεπτα.

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

### Τι σημαίνει «Guideline 2.5.4 - Performance - Software Requirements»;

Είναι ο τίτλος της απόρριψης όταν η Apple κρίνει ότι ένα background mode του Info.plist σου δεν χρησιμοποιείται για τον σκοπό για τον οποίο υπάρχει. Το μήνυμα κατονομάζει το mode και προτείνει να δείξεις τη λειτουργία που το χρησιμοποιεί ή να αφαιρέσεις το κλειδί.

### Χρειάζεται νέο build μετά από απόρριψη 2.5.4;

Αν αφαιρέσεις ή αλλάξεις ένα mode, ναι: το κλειδί είναι στο Info.plist, άρα στο binary. Αν το mode είναι δικαιολογημένο, μπορεί να αρκεί μια απάντηση με την ακριβή διαδρομή και ένα βίντεο.

### Μπορώ να κρατήσω το audio mode για μερικούς ήχους interface;

Όχι. Σύντομοι ήχοι που παίζουν στο προσκήνιο δεν το χρειάζονται. Με το Expo, βάλε το `enableBackgroundPlayback` σε `false` στο plugin expo-audio.

### Μια app ξυπνητηριού χρειάζεται το audio mode;

Όχι για να χτυπήσει, αν βασίζεται στο AlarmKit, διαθέσιμο από το iOS 26: το σύστημα παίζει το ξυπνητήρι. Στο Solys, το mode `audio` χρησιμεύει για την παρακολούθηση της νύχτας, που ηχογραφεί με κλειδωμένη οθόνη.

### Γιατί η Apple αναφέρει την 2.5.4 ενώ δεν δήλωσα τίποτα;

Ίσως το έκανε ένα plugin για σένα: το expo-audio προσθέτει το mode `audio` από προεπιλογή, και ένας παλιός φάκελος `ios/` μπορεί να κρατά κλειδί που αφαίρεσες από τη ρύθμισή σου. Έλεγξε με `npx expo config --type introspect`.


## Το project σου

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

[iOS & Android Kit](https://devoria.fr/el/kits/ios): Φτιάξε την εφαρμογή σου για iPhone και Android με το Claude Code: ο αρχικός κώδικας των εφαρμογών μου, η διαδρομή μέχρι τα stores και όλα τα kits. 99 €.

[Διάγνωση: τι σε χωρίζει από την iPhone εφαρμογή σου](https://devoria.fr/el/diagnostic): 7 ερωτήσεις, 60 δευτερόλεπτα: μαθαίνεις τι πραγματικά σε μπλοκάρει για να δημοσιεύσεις την iPhone εφαρμογή σου, τη διαδρομή σου σε 4 βήματα και το kit που σου ταιριάζει.
