Guideline 2.5.1: δημόσια API και ενημερωμένο SDK με Expo
Από Mehdi Azizi
Δημοσιεύτηκε στις , 9 λ.
Guideline 2.5.1: μόνο δημόσια API, συμβατότητα με το τρέχον iOS, frameworks για τη χρήση τους. Με Expo, έλεγξε πρώτα τα native modules σου.
Η guideline 2.5.1 θέτει τέσσερις απαιτήσεις: να χρησιμοποιείς μόνο δημόσια API, να τρέχει η εφαρμογή στην τρέχουσα έκδοση του iOS, να εγκαταλείπεις ό,τι η Apple κάνει deprecated και να χρησιμοποιείς κάθε framework για τον σκοπό για τον οποίο φτιάχτηκε. Με Expo, ο κίνδυνος σπάνια προέρχεται από τον JavaScript κώδικά σου: προέρχεται από τα native modules που εγκαθιστάς και από το SDK με το οποίο κάνεις compile.
Δημοσιεύω τα Solys, TradaZen και Nolera με Expo SDK 57. Το Solys βασίζεται στο Screen Time API της Apple, ένα framework με ελεγχόμενη χρήση. Αυτός ο οδηγός αφορά τον κανόνα της αξιολόγησης. Για το σφάλμα που λαμβάνεις κατά την αποστολή του build, διάβασε τον οδηγό ITMS-90338. Για τα background modes, που βρίσκονται στην ίδια ενότητα, διάβασε τον οδηγό της guideline 2.5.4.
Τι λέει η guideline 2.5.1;
Ο κανόνας βρίσκεται στην ενότητα 2.5, «Software Requirements», των App Review Guidelines: «Apps may only use public APIs and must run on the currently shipping OS. Keep your apps up-to-date and make sure you phase out any deprecated features, frameworks or technologies that will no longer be supported in future versions of an OS. Apps should use APIs and frameworks for their intended purposes and indicate that integration in their app description.»
Με απλά λόγια, τέσσερις υποχρεώσεις:
- Μόνο δημόσια API, δηλαδή τεκμηριωμένα από την Apple.
- Μια εφαρμογή που τρέχει στην τρέχουσα έκδοση του iOS, το iOS 27 από τον Σεπτέμβριο του 2026.
- Τίποτα deprecated που πρόκειται να εξαφανιστεί: αντικαθιστάς ό,τι η Apple ανακοινώνει ότι φτάνει στο τέλος του.
- Κάθε framework στη θέση του, και αναφερόμενο στην περιγραφή: HomeKit για το έξυπνο σπίτι, HealthKit για την υγεία και τη γυμναστική, συνδεδεμένο με την εφαρμογή Health.
Από εκεί προκύπτει ο τίτλος της απόρριψης: «Guideline 2.5.1 - Performance - Software Requirements».
Δημόσια API: πού κρύβεται ο κίνδυνος σε μια εφαρμογή Expo
Ένα ιδιωτικό API είναι μια λειτουργία του συστήματος που η Apple δεν τεκμηριώνει. Η Apple δεν εγγυάται ούτε τη συμπεριφορά του ούτε την ύπαρξή του στην επόμενη έκδοση του iOS, γι' αυτό και απαγορεύεται.
Ο JavaScript κώδικάς σου δεν αγγίζει ποτέ απευθείας το iOS: περνάει μέσα από native modules. Αυτά του Expo SDK τα συντηρεί η ομάδα του Expo. Τα υπόλοιπα περιέχουν κώδικα που δεν έγραψες εσύ, και η Apple τον εξετάζει σαν να ήταν δικός σου. Ο οδηγός ITMS-90683 δείχνει τον ίδιο μηχανισμό με τα κείμενα αδειών: η Apple κρίνει τον κώδικα που υπάρχει στο build, όχι αυτό που κάνει η εφαρμογή.
Στο Solys, στις 15 Οκτωβρίου 2026, 42 άμεσες εξαρτήσεις περιέχουν native κώδικα iOS, από τις οποίες 14 εκτός Expo SDK. Ανάμεσά τους τα RevenueCat, Sentry, AppsFlyer και το react-native-device-activity, η γέφυρα προς το Screen Time API.
Ένα ιδιωτικό API μπορεί να εντοπιστεί σε δύο στιγμές. Κατά την αποστολή, η αυτόματη ανάλυση του App Store Connect μπορεί να επιστρέψει το σφάλμα ITMS-90338. Κατά την αξιολόγηση, ο reviewer αναφέρει την 2.5.1.
Deprecated API: από το UIWebView στο UIScene
Το πιο γνωστό παράδειγμα είναι το UIWebView, το παλιό component για την προβολή web περιεχομένου. Η Apple σταμάτησε να το δέχεται στις νέες εφαρμογές τον Απρίλιο του 2020 και στις ενημερώσεις τον Δεκέμβριο του 2020. Μια παλιά βιβλιοθήκη που έκανε ακόμα αναφορά σε αυτό μπλόκαρε την αποστολή. Στο Solys, η αναζήτηση της λίστας ελέγχου παρακάτω δεν βρίσκει καμία αναφορά.
Η επόμενη αλλαγή έχει ήδη ανακοινωθεί. Η τεχνική σημείωση TN3187 της Apple το γράφει: «In the next major release following iOS 26, UIScene lifecycle will be required when building with the latest SDK; otherwise, your app won't launch.» Με απλά λόγια, μια εφαρμογή που γίνεται compile με το SDK του iOS 27 χωρίς scene-based lifecycle δεν ξεκινά.
Τρεις ημερομηνίες που πρέπει να συνδέσεις:
- Από τον Απρίλιο του 2026, η Apple απαιτεί Xcode 26: αυτό είναι το θέμα του οδηγού ITMS-90725.
- Τον Απρίλιο του 2027, η σελίδα υποβολής της Apple ανακοινώνει ότι το SDK του iOS 27 γίνεται υποχρεωτικό.
- Το Expo SDK 58, σε beta από τις 15 Σεπτεμβρίου 2026, δημιουργεί ήδη τη διαχείριση των scenes, σύμφωνα με την ανακοίνωση του Expo.
Με Expo SDK 57 και Xcode 26, κάνεις ακόμα compile με το SDK του iOS 26: τίποτα δεν χαλάει σήμερα. Τα modules που τροποποιούν το AppDelegate θα πρέπει να ακολουθήσουν πριν τον Απρίλιο του 2027.
Frameworks που χρησιμοποιούνται εκτός του σκοπού τους
Ο reviewer ελέγχει ότι ένα ευαίσθητο framework εξυπηρετεί μια ορατή λειτουργία και ότι η σελίδα της εφαρμογής σου το αναφέρει.
- Το HealthKit εξυπηρετεί την υγεία και τη γυμναστική. Οι οδηγίες διεπαφής της Apple το λένε: «If your app doesn't provide health and fitness functionality, don't request access to people's private health data.»
- Το HomeKit εξυπηρετεί το έξυπνο σπίτι, και τίποτα άλλο.
- Το PushKit εξυπηρετεί τις κλήσεις φωνής μέσω IP. Η τεκμηρίωση του PushKit είναι σαφής: «If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications.» Μια ειδοποίηση VoIP που ξυπνά την εφαρμογή χωρίς κλήση είναι κατάχρηση.
- Το Family Controls, το Screen Time API, απαιτεί ειδική άδεια. Η τεκμηρίωσή του διευκρινίζει: «Before submitting your app to the App Store, you must request permission to use the entitlement.»
Για το Solys, ζήτησα αυτή την άδεια διανομής στις 23 Σεπτεμβρίου 2026, και η Apple την έδωσε την ίδια μέρα. Η χρήση ταιριάζει με το framework: ο χρήστης επιλέγει τις εφαρμογές που θα μπουν σε παύση, και το Solys τις μπλοκάρει για 30, 45 ή 60 λεπτά μετά το ξύπνημα. Η περιγραφή της σελίδας το λέει σε μία πρόταση: «Το Solys χρησιμοποιεί την άδεια Screen Time της Apple για να θέτει σε παύση τις επιλεγμένες εφαρμογές.» Αυτό ζητά το τέλος της 2.5.1: να αναφέρεις την ενσωμάτωση στην περιγραφή.
Εκδόσεις beta: TestFlight ναι, App Store όχι
Οι σημειώσεις έκδοσης του App Store Connect δείχνουν τον κανόνα στην πράξη. Στις 14 Οκτωβρίου 2026, τα builds που έγιναν με Xcode 27.2 beta 3 γίνονται δεκτά «for internal and external testing», δηλαδή για το TestFlight. Στις 5 Οκτωβρίου, αυτά του Xcode 27.1 RC γίνονται δεκτά «for the App Store».
Ένα build που έγινε compile με beta του Xcode πηγαίνει στο TestFlight, ποτέ σε αξιολόγηση. Για να υποβάλεις, χρειάζεσαι τελική έκδοση, ή ένα RC που η Apple έχει ανοίξει για το App Store.
Δύο διευκρινίσεις για μια εφαρμογή Expo:
- Μια beta του Expo δεν είναι beta της Apple. Η Apple ελέγχει την έκδοση του Xcode και του iOS SDK, όχι του Expo. Η ανακοίνωση του SDK 58 πρόσθετε ότι οι εικόνες EAS με Xcode 27 έρχονταν σύντομα.
- Η δοκιμή στο τρέχον iOS παραμένει υποχρεωτική, ακόμα κι αν κάνεις compile με το SDK του iOS 26. Άνοιξε την εφαρμογή από κρύα εκκίνηση σε ενημερωμένο iPhone ή simulator.
Λίστα ελέγχου: native εξαρτήσεις πριν την υποβολή
Πέρασέ την πριν από κάθε production build. Οι εντολές εκτελούνται στη ρίζα του Expo project:
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
- Το
npx expo-doctorδεν αναφέρει καμία αποτυχία. Στο Solys, στις 15 Οκτωβρίου 2026: 20 από 21 έλεγχοι επιτυχείς. Η αποτυχία προερχόταν από 13 πακέτα Expo που υστερούσαν κατά ένα patch, τα οποία ευθυγραμμίζει τοnpx expo install --check. - Κάθε module εκτός Expo SDK υπάρχει στο React Native Directory. Το Expo Doctor κάνει αυτόν τον έλεγχο από προεπιλογή, όπως αναφέρει η τεκμηρίωση του Expo. Ένα άγνωστο πακέτο αξίζει να του διαβάσεις τον κώδικα iOS.
- Κάθε native module ακολουθεί την έκδοση του React Native σου. Ο πίνακας εκδόσεων του Expo αντιστοιχίζει το SDK 57 με το React Native 0.86. Ένα module χωρίς νέα έκδοση εδώ και αρκετές εκδόσεις είναι προειδοποιητικό σημάδι.
- Η αναζήτηση για UIWebView δεν επιστρέφει τίποτα. Κάνε το ίδιο για κάθε API που η Apple ανακοινώνει ότι φτάνει στο τέλος του.
- Κάθε ευαίσθητο framework έχει την ορατή λειτουργία του: υγεία, Screen Time, κλήσεις, σπίτι. Η περιγραφή την αναφέρει, και η ειδική άδεια έχει δοθεί.
- Το build βγαίνει από τελικό Xcode. Έλεγξε την έκδοση στα logs του EAS Build.
- Η εφαρμογή ξεκινά από κρύα εκκίνηση στην τρέχουσα έκδοση του iOS, με καινούργιο λογαριασμό.
- Τα modules που αγγίζουν το AppDelegate δηλώνουν υποστήριξη για UIScene πριν περάσεις στο SDK του iOS 27.
Πώς απαντάς σε μια απόρριψη 2.5.1;
Το μήνυμα συνήθως ονομάζει το API ή το framework που φταίει. Δύο περιπτώσεις:
- Το framework δεν εξυπηρετεί τίποτα ορατό: αφαίρεσε το module ή το capability, κάνε νέο build και μετά απάντησε σε δύο προτάσεις.
- Το framework εξυπηρετεί πραγματική λειτουργία: δώσε την ακριβή διαδρομή, ένα στιγμιότυπο ή ένα σύντομο βίντεο, και ανέφερε την ενσωμάτωση στην περιγραφή της σελίδας.
Η αφαίρεση ενός native module αλλάζει το binary: μια απομακρυσμένη ενημέρωση δεν αρκεί. Ο οδηγός της guideline 2.1 εξηγεί γιατί ο reviewer βλέπει μόνο τον κώδικα που περιέχεται στο build. Η συζήτηση συνεχίζεται μετά στο App Store Connect, όπως στον οδηγό για το πώς να απαντήσεις στο App Review.
Έλεγξε το project σου πριν την αποστολή
Το Review Kit συγκεντρώνει τη λίστα ελέγχου μου πριν την αποστολή, τις απορρίψεις μου που διόρθωσα και skills του Claude Code που ελέγχουν το Expo project σου. Για ανθρώπινη ματιά, κλείσε μία ώρα μαζί μου: διαβάζουμε μαζί το μήνυμα της Apple και τις εξαρτήσεις σου. Η πλήρης διαδικασία βρίσκεται στη σελίδα εφαρμογή που απορρίφθηκε από την Apple.
Ετοιμάζεις την πρώτη σου κυκλοφορία; Κάνε τη δωρεάν διάγνωση: σου στέλνει τη λίστα ελέγχου μου κατά των απορρίψεων της Apple.
Συχνές ερωτήσεις
Τι σημαίνει «Guideline 2.5.1 - Performance - Software Requirements»;
Είναι ο τίτλος της απόρριψης όταν η Apple κρίνει ότι η εφαρμογή σου χρησιμοποιεί μη δημόσιο API, deprecated τεχνολογία ή framework εκτός του σκοπού του. Το μήνυμα συνήθως ονομάζει το στοιχείο που φταίει.
Ποια η διαφορά ανάμεσα στην guideline 2.5.1 και στο σφάλμα ITMS-90338;
Το ITMS-90338 είναι αυτόματο σφάλμα που λαμβάνεις κατά την αποστολή του build, όταν η ανάλυση εντοπίζει ένα μη δημόσιο symbol. Η 2.5.1 είναι ο κανόνας αξιολόγησης που εφαρμόζει ένας άνθρωπος, και καλύπτει επίσης frameworks που χρησιμοποιούνται καταχρηστικά και deprecated τεχνολογίες.
Μπορείς να υποβάλεις εφαρμογή που έγινε compile με beta του Xcode;
Όχι. Το App Store Connect δέχεται αυτά τα builds μόνο για το TestFlight. Για την αξιολόγηση, κάνε compile με τελική έκδοση του Xcode, ή με ένα RC που η Apple έχει ανοίξει για το App Store στις σημειώσεις έκδοσης.
Μπορεί μια εφαρμογή Expo να χρησιμοποιεί ιδιωτικό API χωρίς να το ξέρεις;
Ναι, μέσω ενός native module τρίτου. Ο JavaScript κώδικάς σου δεν καλεί ο ίδιος το iOS, αλλά κάθε native πακέτο περιέχει κώδικα Objective-C ή Swift. Διάβασε τη λίστα των modules εκτός Expo SDK πριν από κάθε έκδοση.
Πρέπει να περάσεις αμέσως στο Expo SDK 58;
Όχι για την 2.5.1, στις 15 Οκτωβρίου 2026: το SDK 57 κάνει compile με το SDK του iOS 26, που γίνεται ακόμα δεκτό. Προγραμμάτισε την αναβάθμιση πριν τον Απρίλιο του 2027, όταν η Apple θα απαιτεί το SDK του iOS 27 και το scene-based lifecycle.

