Guideline 2.5.1: publika API:er och aktuell SDK med Expo
Av Mehdi Azizi
Publicerad , 9 min
Guideline 2.5.1: bara publika API:er, en app som fungerar på aktuell iOS och ramverk för avsett syfte. Med Expo kollar du först dina native-moduler.
Guideline 2.5.1 ställer fyra krav: använd bara publika API:er, fungera på den aktuella iOS-versionen, fasa ut det Apple markerar som föråldrat och använd varje ramverk för det syfte det är avsett för. Med Expo kommer risken sällan från din JavaScript-kod: den kommer från de native-moduler du installerar och från den SDK du kompilerar med.
Jag publicerar Solys, TradaZen och Nolera med Expo SDK 57. Solys bygger på Apples Screen Time-API, ett ramverk med reglerad användning. Den här guiden handlar om granskningsregeln. För felet du får när du skickar in bygget, läs guiden om ITMS-90338. För bakgrundslägen, som ligger i samma avsnitt, läs guiden om guideline 2.5.4.
Vad säger guideline 2.5.1?
Regeln finns i avsnitt 2.5, "Software Requirements", i 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."
Kort sagt, fyra skyldigheter:
- Bara publika API:er, alltså sådana som Apple dokumenterar.
- En app som fungerar på den aktuella iOS-versionen, iOS 27 sedan september 2026.
- Inget föråldrat som kommer att försvinna: du ersätter det Apple meddelar är på väg ut.
- Varje ramverk på sin plats, och nämnt i beskrivningen: HomeKit för det smarta hemmet, HealthKit för hälsa och träning, kopplat till appen Hälsa.
Därav rubriken på avslaget: "Guideline 2.5.1 - Performance - Software Requirements".
Publika API:er: var risken gömmer sig i en Expo-app
Ett privat API är en systemfunktion som Apple inte dokumenterar. Apple garanterar varken hur den beter sig eller att den finns kvar i nästa iOS-version, därav förbudet.
Din JavaScript-kod rör aldrig iOS direkt: den går via native-moduler. Modulerna i Expo SDK underhålls av Expo-teamet. De andra innehåller kod som du inte har skrivit, och Apple granskar den som om den vore din. Guiden om ITMS-90683 visar samma mekanism med behörighetstexterna: Apple bedömer koden som finns i bygget, inte vad appen gör.
I Solys innehåller 42 direkta beroenden native iOS-kod per den 15 oktober 2026, varav 14 utanför Expo SDK. Bland dem finns RevenueCat, Sentry, AppsFlyer och react-native-device-activity, bryggan till Screen Time-API:et.
Ett privat API kan upptäckas vid två tillfällen. Vid inskickningen kan App Store Connects automatiska analys returnera felet ITMS-90338. Under granskningen hänvisar granskaren till 2.5.1.
Föråldrade API:er: från UIWebView till UIScene
Det mest kända exemplet är UIWebView, den gamla komponenten för att visa webbinnehåll. Apple slutade acceptera den i nya appar i april 2020, och sedan i uppdateringar i december 2020. Ett gammalt bibliotek som fortfarande refererade till den blockerade inskickningen. I Solys hittar sökningen i checklistan längre ner inga referenser.
Nästa förändring är redan aviserad. Apples tekniska anteckning TN3187 skriver: "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." Kort sagt: en app som kompileras med iOS 27-SDK:n utan scenbaserad livscykel startar inte.
Tre datum att koppla ihop:
- Sedan april 2026 kräver Apple Xcode 26: det är ämnet för guiden om ITMS-90725.
- I april 2027 blir iOS 27-SDK:n obligatorisk enligt Apples sida om inskickning.
- Expo SDK 58, i beta sedan den 15 september 2026, genererar redan scenhanteringen enligt Expos tillkännagivande.
Med Expo SDK 57 och Xcode 26 kompilerar du fortfarande med iOS 26-SDK:n: inget går sönder i dag. Moduler som ändrar AppDelegate måste hänga med före april 2027.
Ramverk som används utanför sitt avsedda syfte
Granskaren kontrollerar att ett känsligt ramverk används för en synlig funktion och att din produktsida nämner det.
- HealthKit är till för hälsa och träning. Apples riktlinjer för gränssnitt säger: "If your app doesn't provide health and fitness functionality, don't request access to people's private health data."
- HomeKit är till för det smarta hemmet, och inget annat.
- PushKit är till för samtal via IP-telefoni. Dokumentationen för PushKit är tydlig: "If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications." En VoIP-notis som väcker appen utan något samtal är missbruk.
- Family Controls, Screen Time-API:et, kräver en särskild behörighet. Dess dokumentation anger: "Before submitting your app to the App Store, you must request permission to use the entitlement."
För Solys ansökte jag om den här distributionsbehörigheten den 23 september 2026, och Apple beviljade den samma dag. Användningen stämmer med ramverket: användaren väljer vilka appar som ska pausas, och Solys blockerar dem i 30, 45 eller 60 minuter efter väckningen. Produktsidans beskrivning säger det i en mening: "Solys använder Apples Screen Time-behörighet för att pausa de valda apparna." Det är vad slutet av 2.5.1 kräver: att integrationen nämns i beskrivningen.
Betaversioner: TestFlight ja, App Store nej
Release notes för App Store Connect visar regeln i praktiken. Den 14 oktober 2026 accepteras byggen gjorda med Xcode 27.2 beta 3 "for internal and external testing", alltså för TestFlight. Den 5 oktober accepteras byggen från Xcode 27.1 RC "for the App Store".
Ett bygge kompilerat med en betaversion av Xcode går till TestFlight, aldrig till granskning. För att skicka in behöver du en slutversion, eller en RC som Apple har öppnat för App Store.
Två förtydliganden för en Expo-app:
- En Expo-beta är inte en Apple-beta. Apple kontrollerar versionen av Xcode och iOS-SDK:n, inte Expos version. Tillkännagivandet av SDK 58 tillade att EAS-avbilder med Xcode 27 snart skulle komma.
- Att testa på aktuell iOS är fortfarande obligatoriskt, även om du kompilerar med iOS 26-SDK:n. Kallstarta appen på en uppdaterad iPhone eller simulator.
Checklista: native-beroenden före inskickning
Gå igenom den före varje produktionsbygge. Kommandona körs i roten av Expo-projektet:
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
npx expo-doctorrapporterar inga fel. I Solys den 15 oktober 2026: 20 av 21 kontroller godkända. Felet kom från 13 Expo-paket som låg en patch efter, vilketnpx expo install --checkrättar till.- Varje modul utanför Expo SDK finns i React Native Directory. Expo Doctor gör den kontrollen som standard, enligt Expos dokumentation. Ett okänt paket förtjänar att du läser dess iOS-kod.
- Varje native-modul följer din React Native-version. Expos versionstabell kopplar SDK 57 till React Native 0.86. En modul som inte har släppts på flera versioner är en varningssignal.
- Sökningen efter UIWebView ger inga träffar. Gör likadant för alla API:er som Apple meddelar är på väg ut.
- Varje känsligt ramverk har sin synliga funktion: hälsa, Screen Time, samtal, hem. Beskrivningen nämner den, och den särskilda behörigheten är beviljad.
- Bygget kommer från en slutversion av Xcode. Kontrollera versionen i EAS byggloggar.
- Appen kallstartar på den aktuella iOS-versionen, med ett nytt konto.
- Moduler som rör AppDelegate meddelar stöd för UIScene innan du går över till iOS 27-SDK:n.
Hur svarar man på ett 2.5.1-avslag?
Meddelandet nämner oftast vilket API eller ramverk det gäller. Två fall:
- Ramverket används inte till något synligt: ta bort modulen eller funktionen, gör ett nytt bygge och svara med två meningar.
- Ramverket används för en verklig funktion: ange exakt väg, en skärmdump eller en kort video, och nämn integrationen i produktsidans beskrivning.
Att ta bort en native-modul ändrar binären: en fjärruppdatering räcker inte. Guiden om guideline 2.1 förklarar varför granskaren bara ser den inbyggda koden. Konversationen förs sedan i App Store Connect, som i guiden om att svara App Review.
Kontrollera ditt projekt före inskickning
Review Kit samlar min checklista före inskickning, mina åtgärdade avslag och Claude Code-skills som går igenom ditt Expo-projekt. Vill du ha ett mänskligt öga, boka en timme med mig: vi läser Apples meddelande och dina beroenden tillsammans. Hela tillvägagångssättet finns på sidan app avvisad av Apple.
Förbereder du din första lansering? Gör din gratis diagnos: den skickar dig min checklista mot avslag från Apple.
Vanliga frågor
Vad betyder "Guideline 2.5.1 - Performance - Software Requirements"?
Det är rubriken på avslaget när Apple anser att din app använder ett icke-publikt API, en föråldrad teknik eller ett ramverk utanför dess avsedda syfte. Meddelandet nämner oftast vad det gäller.
Vad är skillnaden mellan guideline 2.5.1 och felet ITMS-90338?
ITMS-90338 är ett automatiskt fel som du får när du skickar in bygget, när analysen hittar en icke-publik symbol. 2.5.1 är granskningsregeln som tillämpas av en människa, och den täcker även missbrukade ramverk och föråldrade tekniker.
Kan man skicka in en app kompilerad med en betaversion av Xcode?
Nej. App Store Connect accepterar sådana byggen bara för TestFlight. För granskning kompilerar du med en slutversion av Xcode, eller en RC som Apple har öppnat för App Store i sina release notes.
Kan en Expo-app använda ett privat API utan att du vet om det?
Ja, via en native-modul från tredje part. Din JavaScript-kod anropar inte iOS själv, men varje native-paket innehåller Objective-C- eller Swift-kod. Gå igenom listan över moduler utanför Expo SDK före varje version.
Ska man gå över till Expo SDK 58 direkt?
Inte för 2.5.1 per den 15 oktober 2026: SDK 57 kompilerar med iOS 26-SDK:n, som fortfarande accepteras. Planera uppgraderingen före april 2027, när Apple kräver iOS 27-SDK:n och den scenbaserade livscykeln.

