ITMS-90683: ret “Missing purpose string” med Expo
Af Mehdi Azizi
Udgivet , 6 min.
ITMS-90683 Missing purpose string: hvorfor Apple afviser dit build, hvilken nøgle du skal tilføje i app.json med Expo, og hvordan du finder manglende nøgler.
ITMS-90683 er en automatisk afvisning fra Apple: den kommer på mail kort efter, at du har sendt dit build, før nogen menneskelig gennemgang. Den betyder, at din Info.plist mangler den sætning, der forklarer, hvorfor appen får adgang til følsomme data. Rettelsen tager to trin: tilføj nøglen fra beskeden i ios.infoPlist, og lav et nyt build.
Jeg fik den på Solys, min vækkeur-app med minispil, for data som appen slet ikke bruger. Her er, hvad beskeden betyder, hvorfor den dukker op, og hvordan du undgår den.
Hvad betyder fejlen ITMS-90683?
Den fulde besked hedder "ITMS-90683: Missing purpose string in Info.plist". Den siger, at koden i din app refererer til et API, der rører ved følsomme data (fotos, kamera, mikrofon, placering, kontakter), og at din Info.plist ikke indeholder den tilsvarende beskrivelsesnøgle. Beskeden nævner nøglen, for eksempel NSPhotoLibraryUsageDescription.
Den beskrivende sætning kaldes en "purpose string". Det er den tekst, iOS viser i vinduet, hvor brugeren bliver bedt om tilladelse. Apple skriver det i sin dokumentation om adgang til beskyttede ressourcer: App Review afviser apps, hvis kode tilgår disse ressourcer uden en purpose string.
Det er ikke en reviewer, der afviser dig. Kontrollen er automatisk og sker, når buildet leveres, før det kommer i review, ligesom ITMS-91053 for privacy-manifestet. Buildet bliver kasseret, og du skal sende et nyt.
Hvorfor Apple afviser, selvom din app ikke bruger de data
Det er det, der overrasker. Apple analyserer koden i dit build, ikke hvad din app faktisk gør. Hvis et bibliotek, du har med, indeholder en reference til fotobiblioteket, er nøglen påkrævet, selvom ingen skærm nogensinde beder om adgang til fotos. Apples besked siger det selv: et eksternt bibliotek eller SDK kan referere til disse API'er, og purpose string er stadig obligatorisk.
Min sag, den 26. september 2026. Da jeg ryddede op i Solys' konfiguration, fjernede jeg nøglen NSPhotoLibraryUsageDescription, fordi appen ikke rører nogen fotos. Det næste build blev afvist med ITMS-90683. Årsagen: to Expo-biblioteker, som appen bruger, expo-image og expo-file-system, indeholder kode, der refererer til fotobiblioteket. Det forrige build gik igennem, fordi nøglen stadig var der.
Læren: du fjerner ikke en beskrivelsesnøgle "fordi du ikke bruger den". Du fjerner den kun, når intet bibliotek i buildet længere refererer til API'et.
De mest almindelige nøgler
NSPhotoLibraryUsageDescription: læsning eller skrivning af fotos.NSPhotoLibraryAddUsageDescription: tilføjelse af fotos, uden læsning.NSCameraUsageDescription: kamera.NSMicrophoneUsageDescription: mikrofon.NSLocationWhenInUseUsageDescription: placering, mens appen er i brug.NSContactsUsageDescription: kontakter.NSUserTrackingUsageDescription: annoncesporing (App Tracking Transparency).
Apple beskriver hver nøgle i sin dokumentation, for eksempel den for NSPhotoLibraryUsageDescription: den er påkrævet, så snart appen bruger et API, der læser eller skriver i fotobiblioteket.
Ret ITMS-90683 i en Expo-app
- Find nøglen i mailen fra Apple. Beskeden giver det præcise navn.
- Tilføj den i din konfiguration, under
ios.infoPlist, som beskrevet i Expos dokumentation om tilladelser:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Solys har ikke adgang til dine fotos. Denne tilladelse bliver aldrig anmodet om."
}
}
}
}
- Lav et nyt build. Expo siger det klart: en ændring i Info.plist kan ikke sendes som en fjernopdatering, den kræver en ny binær fil.
- Send buildet til Apple igen, og vælg det i din version.
En faldgrube, hvis din app er oversat: sprogfilerne oversætter en nøgle, de erklærer den ikke. Nøglen skal først findes i ios.infoPlist (eller i konfigurationen af det relevante plugin). Ellers kan appen crashe ved første kald.
Hvilken sætning skal du skrive, hvis din app ikke bruger de data?
Apple beder om en præcis, nyttig og konkret beskrivelse. Hvis din app virkelig bruger dataene, så sig hvad de bruges til, i én sætning: "Appen bruger kameraet til at scanne stregkoden på din billet."
Hvis nøglen kun er der på grund af et bibliotek, giver Apple to løsninger: skriv sætningen, eller fjern koden, der tilgår dataene. Når koden kommer fra et bibliotek, kan du ikke bare fjerne den. På Solys skrev jeg derfor sandheden: "Solys har ikke adgang til dine fotos. Denne tilladelse bliver aldrig anmodet om." Det er et pragmatisk valg: det næste build kom igennem ved leveringen, men jeg kan ikke love dig, at Apple altid vil acceptere den sætning.
Find manglende nøgler før du sender
Fra roden af dit projekt viser denne kommando de biblioteksfiler, hvis iOS-kode refererer til de mest overvågede API'er:
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
node_modules/*/ios node_modules/@*/*/ios
Hvert navn svarer til en type data: PHPhotoLibrary til fotos, AVCaptureDevice til kamera og mikrofon, CLLocationManager til placering, CNContactStore til kontakter, EKEventStore til kalender, ATTrackingManager til sporing. For hvert resultat skal du tjekke, at den tilsvarende beskrivelsesnøgle findes i din konfiguration.
Dette sikkerhedsnet fanger de tilfælde, jeg selv er stødt på. Det erstatter ikke mailen fra Apple, som er den eneste sikre liste, ligesom for de ikke-offentlige API'er i ITMS-90338. Siden den afvisning kører jeg dette tjek før hvert build: det tager et par sekunder, mens en ITMS-90683-afvisning koster et build og tiden til at lave det igen.
Send dit build uden ubehagelige overraskelser
ITMS-90683 er hurtig at rette, når du ved, hvordan du læser den, ligesom ITMS-90725, der handler om Xcode-versionen. De afvisninger, der kommer bagefter, dem fra en reviewer, kræver mere overblik: fremgangsmåden står på siden app afvist af Apple, og de hyppigste årsager står i hvorfor Apple afviser en app.
For at tjekke dit projekt før du sender, samler Apple Review Kit min tjekliste og Claude Code-skills, der gennemgår dit projekt. Hvis din indsendelse sidder fast, og du vil have et menneskeligt blik på det, så book en time med mig: vi gennemgår dit projekt over video, på din skærm. Og hvis du forbereder din første udgivelse, så tag din gratis diagnose: den sætter trinene i rækkefølge og sender dig min tjekliste mod afvisninger fra Apple.
Ofte stillede spørgsmål
Er ITMS-90683 en afvisning fra App Review?
Ikke i betydningen en menneskelig reviewer. Det er en automatisk kontrol af buildet ved levering, før det kommer i review, ligesom ITMS-90717 for ikonet. Ingen har åbnet din app. Buildet bliver kasseret: du skal rette Info.plist og sende et nyt.
Hvorfor kræver Apple en nøgle for data, som min app ikke bruger?
Fordi Apple analyserer koden i buildet, ikke appens adfærd. Hvis et indbygget bibliotek refererer til fotobiblioteket eller kameraet, er beskrivelsesnøglen påkrævet, selvom ingen skærm nogensinde beder om den adgang.
Kan man rette ITMS-90683 med en fjernopdatering?
Nej. Den manglende nøgle ligger i Info.plist, som er en del af den binære fil. En fjernopdatering ændrer ikke den fil: du skal lave et nyt build og sende det til Apple igen.
Hvor tilføjer man NSPhotoLibraryUsageDescription i et Expo-projekt?
I din app-konfiguration, under ios.infoPlist, med en sætning der beskriver brugen. Nogle biblioteker tilbyder også en særlig indstilling i deres plugin, som kan tilføje andre nøgler, for eksempel en baggrundstilstand. I begge tilfælde skal nøglen findes i grundkonfigurationen, ikke kun i oversættelsesfilerne.
Skal man fjerne ubrugte beskrivelsesnøgler?
Kun hvis intet bibliotek i buildet længere refererer til det pågældende API. Ellers bliver næste indsendelse afvist med ITMS-90683. Før du fjerner en nøgle, så søg efter API'ets navn i iOS-koden i dine afhængigheder.