ITMS-90683: fiks «Missing purpose string» med Expo
Av Mehdi Azizi
Publisert , 6 min
ITMS-90683 Missing purpose string: hvorfor Apple avviser builden din, hvilken nøkkel du legger i app.json med Expo, og hvordan du finner manglende nøkler før opplasting.
ITMS-90683 er en automatisk avvisning fra Apple. Den kommer på e-post kort tid etter at du har lastet opp builden, før noen mennesker har sett på den. Den betyr at Info.plist-filen din mangler setningen som forklarer hvorfor appen bruker en sensitiv type data. Løsningen er to steg: legg til nøkkelen som nevnes i meldingen under ios.infoPlist, og lag en ny build.
Jeg fikk den på Solys, vekkerklokka mi med minispill, for data appen ikke engang bruker. Her er hva meldingen betyr, hvorfor den dukker opp, og hvordan du unngår den.
Hva betyr feilen ITMS-90683?
Hele meldingen heter «ITMS-90683: Missing purpose string in Info.plist». Den sier at koden i appen din refererer til et API som berører sensitive data (bilder, kamera, mikrofon, posisjon, kontakter), og at Info.plist ikke har den tilhørende beskrivelsesnøkkelen. Meldingen oppgir hvilken nøkkel det gjelder, for eksempel NSPhotoLibraryUsageDescription.
Denne beskrivelsen kalles en «purpose string». Det er teksten iOS viser i vinduet som ber om tillatelse. Apple skriver det i dokumentasjonen om tilgang til beskyttede ressurser: App Review avviser apper der koden bruker disse ressursene uten purpose string.
Det er ikke en reviewer som avviser deg. Sjekken er automatisk og skjer når builden leveres, før den går til gjennomgang, akkurat som ITMS-91053 for personvernmanifestet. Builden blir forkastet, og du må sende inn en ny.
Hvorfor Apple avviser selv om appen din ikke bruker disse dataene
Det er dette som overrasker. Apple analyserer koden i builden din, ikke hva appen faktisk gjør. Hvis et bibliotek du har med refererer til fotobiblioteket, kreves nøkkelen, selv om ingen skjerm noen gang ber om tilgang til bilder. Apple sier det selv i meldingen: et eksternt bibliotek eller SDK kan referere til disse API-ene, og purpose string er fortsatt påkrevd.
Mitt tilfelle, 26. september 2026. Da jeg ryddet i konfigurasjonen til Solys, fjernet jeg nøkkelen NSPhotoLibraryUsageDescription, siden appen ikke rører et eneste bilde. Neste build ble avvist med ITMS-90683. Årsaken: to Expo-biblioteker som appen bruker, expo-image og expo-file-system, inneholder kode som refererer til fotobiblioteket. Den forrige builden gikk gjennom fordi nøkkelen fortsatt var der.
Lærdommen: du fjerner ikke en beskrivelsesnøkkel «fordi du ikke bruker den». Du fjerner den bare når ingen biblioteker i builden lenger refererer til API-et.
De vanligste nøklene
NSPhotoLibraryUsageDescription: lese eller skrive bilder.NSPhotoLibraryAddUsageDescription: legge til bilder, uten å lese.NSCameraUsageDescription: kamera.NSMicrophoneUsageDescription: mikrofon.NSLocationWhenInUseUsageDescription: posisjon mens appen er i bruk.NSContactsUsageDescription: kontakter.NSUserTrackingUsageDescription: annonsesporing (App Tracking Transparency).
Apple beskriver hver nøkkel i dokumentasjonen, for eksempel NSPhotoLibraryUsageDescription: den kreves så snart appen bruker et API som leser fra eller skriver til fotobiblioteket.
Fiks ITMS-90683 i en Expo-app
- Noter nøkkelen som står i e-posten fra Apple. Meldingen oppgir det nøyaktige navnet.
- Legg den inn i konfigurasjonen din, under
ios.infoPlist, slik Expo-dokumentasjonen om tillatelser beskriver:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Solys har ikke tilgang til bildene dine. Denne tillatelsen blir aldri bedt om."
}
}
}
}
- Lag en ny build. Expo sier det tydelig: en endring i Info.plist kan ikke sendes som en fjernoppdatering, den krever en ny binærfil.
- Send builden til Apple på nytt, og velg den i versjonen din.
En felle hvis appen din er oversatt: språkfilene oversetter en nøkkel, de deklarerer den ikke. Nøkkelen må først finnes i ios.infoPlist (eller i konfigurasjonen til det aktuelle pluginet). Ellers kan appen krasje ved første kall.
Hvilken setning skal du skrive hvis appen ikke bruker dataene?
Apple ber om en beskrivelse som er korrekt, nyttig og presis. Hvis appen faktisk bruker dataene, si hva de brukes til, i én setning: «Appen bruker kameraet til å skanne strekkoden på billetten din.»
Hvis nøkkelen bare er der på grunn av et bibliotek, gir Apple to løsninger: skrive setningen, eller fjerne koden som bruker dataene. Når den koden kommer fra et bibliotek, kan du ikke bare fjerne den. På Solys skrev jeg derfor sannheten: «Solys har ikke tilgang til bildene dine. Denne tillatelsen blir aldri bedt om.» Det er et pragmatisk valg: neste build gikk gjennom ved levering, men jeg kan ikke love deg at Apple alltid godtar den setningen.
Finn manglende nøkler før opplasting
Fra rotmappen i prosjektet ditt lister denne kommandoen opp filene i bibliotekene der iOS-koden refererer til de mest overvåkede API-ene:
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
node_modules/*/ios node_modules/@*/*/ios
Hvert navn tilsvarer en type data: PHPhotoLibrary for bilder, AVCaptureDevice for kamera og mikrofon, CLLocationManager for posisjon, CNContactStore for kontakter, EKEventStore for kalender, ATTrackingManager for sporing. For hvert treff sjekker du at den tilhørende beskrivelsesnøkkelen finnes i konfigurasjonen din.
Dette sikkerhetsnettet fanger tilfellene jeg selv har støtt på. Det erstatter ikke å lese e-posten fra Apple, som er den eneste sikre listen, akkurat som for de ikke-offentlige API-ene i ITMS-90338. Etter denne avvisningen kjører jeg sjekken før hver build: den tar noen sekunder, mens en ITMS-90683-avvisning koster en build og tiden det tar å lage den på nytt.
Send builden uten ubehagelige overraskelser
ITMS-90683 er rask å fikse når du vet hvordan du leser den, akkurat som ITMS-90725, som gjelder Xcode-versjonen. Avvisningene som kommer senere, de fra en reviewer, krever mer ettertanke: fremgangsmåten står på siden om app avvist av Apple, og de vanligste årsakene finner du i hvorfor Apple avviser en app.
For å sjekke alt før innsending samler Apple Review Kit sjekklisten min og Claude Code-skills som går gjennom prosjektet ditt. Hvis innsendingen står fast og du vil ha et menneskelig blikk, book en time med meg: vi går gjennom prosjektet ditt på video, på din skjerm. Og hvis du forbereder din første lansering, ta den gratis diagnosen: den setter stegene i riktig rekkefølge og sender deg sjekklisten min mot avvisninger fra Apple.
Ofte stilte spørsmål
Er ITMS-90683 en avvisning fra App Review?
Ikke i betydningen en menneskelig reviewer. Det er en automatisk sjekk av builden når den leveres, før den går til gjennomgang, akkurat som ITMS-90717 for ikonet. Ingen har åpnet appen din. Builden blir forkastet: du må rette Info.plist og sende inn en ny.
Hvorfor krever Apple en nøkkel for data appen min ikke bruker?
Fordi Apple analyserer koden i builden, ikke hvordan appen oppfører seg. Hvis et inkludert bibliotek refererer til fotobiblioteket eller kameraet, kreves beskrivelsesnøkkelen, selv om ingen skjerm noen gang ber om denne tilgangen.
Kan jeg fikse ITMS-90683 med en fjernoppdatering?
Nei. Nøkkelen som mangler ligger i Info.plist, som er en del av binærfilen. En fjernoppdatering endrer ikke denne filen: du må lage en ny build og sende den til Apple.
Hvor legger jeg inn NSPhotoLibraryUsageDescription i et Expo-prosjekt?
I app-konfigurasjonen din, under ios.infoPlist, med en setning som beskriver bruken. Noen biblioteker har også en egen innstilling i pluginet sitt, som kan legge til andre nøkler, for eksempel en bakgrunnsmodus. Uansett må nøkkelen finnes i grunnkonfigurasjonen, ikke bare i oversettelsesfilene.
Bør jeg fjerne beskrivelsesnøkler jeg ikke bruker?
Bare hvis ingen biblioteker i builden lenger refererer til det aktuelle API-et. Ellers blir neste innsending avvist med ITMS-90683. Før du fjerner en nøkkel, søk etter API-navnet i iOS-koden til avhengighetene dine.