ITMS-90683: korjaa Missing purpose string Expossa
Kirjoittaja: Mehdi Azizi
Julkaistu , 6 min
ITMS-90683 Missing purpose string: miksi Apple hylkää buildisi, mikä avain lisätään app.jsoniin Expossa ja miten puuttuvat avaimet löydetään ennen lähetystä.
ITMS-90683 on Applen automaattinen hylkäys. Se tulee sähköpostilla pian buildin lähettämisen jälkeen, ennen kuin kukaan ihminen on katsonut sovellusta. Se tarkoittaa, että Info.plist-tiedostostasi puuttuu lause, joka kertoo, miksi sovellus käyttää arkaluonteista tietoa. Korjaukseen riittää kaksi asiaa: lisää viestissä mainittu avain kohtaan ios.infoPlist ja tee uusi build.
Sain tämän itse Solysiin, minipelejä sisältävään herätyskelloosi... ei vaan omaani, ja vieläpä tiedosta, jota sovellus ei edes käytä. Tässä kerron, mitä viesti tarkoittaa, miksi se tulee ja miten sen välttää.
Mitä virhe ITMS-90683 tarkoittaa?
Koko viestin otsikko on "ITMS-90683: Missing purpose string in Info.plist". Se kertoo, että sovelluksesi koodi viittaa rajapintaan, joka käsittelee arkaluonteisia tietoja (kuvat, kamera, mikrofoni, sijainti, yhteystiedot), mutta Info.plist ei sisällä vastaavaa kuvausavainta. Viesti nimeää avaimen, esimerkiksi NSPhotoLibraryUsageDescription.
Tätä kuvauslausetta kutsutaan nimellä "purpose string". Se on teksti, jonka iOS näyttää lupapyyntöikkunassa. Apple sanoo sen dokumentaatiossaan suojattujen resurssien käytöstä: App Review hylkää sovellukset, joiden koodi käyttää näitä resursseja ilman purpose stringiä.
Kyse ei ole reviewerin hylkäyksestä. Tarkistus on automaattinen ja tapahtuu buildin toimituksessa, ennen tarkastukseen siirtymistä, aivan kuten ITMS-91053 tietosuojamanifestin kohdalla. Build hylätään, ja sinun pitää lähettää uusi.
Miksi Apple hylkää, vaikka sovelluksesi ei käytä tätä tietoa
Tämä yllättää monet. Apple analysoi buildisi sisältämän koodin, ei sitä, mitä sovelluksesi oikeasti tekee. Jos mukana olevassa kirjastossa on viittaus kuvakirjastoon, avain vaaditaan, vaikka mikään näkymä ei koskaan pyytäisi pääsyä kuviin. Applen viesti sanoo sen itsekin: ulkoinen kirjasto tai SDK voi viitata näihin rajapintoihin, ja purpose string on silti pakollinen.
Oma tapaukseni 26. syyskuuta 2026. Siivosin Solysin asetuksia ja poistin avaimen NSPhotoLibraryUsageDescription, koska sovellus ei koske kuviin lainkaan. Seuraava build hylättiin koodilla ITMS-90683. Syy: kaksi sovelluksen käyttämää Expon kirjastoa, expo-image ja expo-file-system, sisältävät koodia, joka viittaa kuvakirjastoon. Edellinen build meni läpi, koska avain oli vielä paikallaan.
Opetus: kuvausavainta ei poisteta "koska sitä ei käytetä". Sen voi poistaa vasta, kun yksikään buildin kirjasto ei enää viittaa kyseiseen rajapintaan.
Yleisimmät avaimet
NSPhotoLibraryUsageDescription: kuvien luku tai kirjoitus.NSPhotoLibraryAddUsageDescription: kuvien lisääminen ilman lukemista.NSCameraUsageDescription: kamera.NSMicrophoneUsageDescription: mikrofoni.NSLocationWhenInUseUsageDescription: sijainti käytön aikana.NSContactsUsageDescription: yhteystiedot.NSUserTrackingUsageDescription: mainosseuranta (App Tracking Transparency).
Apple kuvaa jokaisen avaimen dokumentaatiossaan, esimerkiksi NSPhotoLibraryUsageDescription: se vaaditaan heti, kun sovellus käyttää rajapintaa, joka lukee kuvakirjastoa tai kirjoittaa siihen.
ITMS-90683:n korjaaminen Expo-sovelluksessa
- Katso Applen sähköpostissa mainittu avain. Viesti kertoo sen tarkan nimen.
- Lisää se asetuksiisi kohtaan
ios.infoPlist, kuten Expon lupia käsittelevä dokumentaatio neuvoo:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Solys ei käytä kuviasi. Tätä lupaa ei koskaan pyydetä."
}
}
}
}
- Tee uusi build. Expo sanoo sen suoraan: Info.plistin muutos ei mene läpi etäpäivityksellä, vaan vaatii uuden binäärin.
- Lähetä build Applelle ja valitse se versioosi.
Ansa, jos sovelluksesi on käännetty: kielitiedostot kääntävät avaimen, mutta eivät määrittele sitä. Avaimen pitää ensin olla olemassa kohdassa ios.infoPlist (tai kyseisen pluginin asetuksissa). Muuten sovellus voi kaatua ensimmäisellä kutsulla.
Mikä lause kirjoitetaan, jos sovellus ei käytä tietoa?
Apple vaatii täsmällisen, hyödyllisen ja tarkan kuvauksen. Jos sovelluksesi oikeasti käyttää tietoa, kerro yhdellä lauseella, mihin: "Sovellus käyttää kameraa lippusi viivakoodin skannaamiseen."
Jos avain on mukana vain kirjaston takia, Apple tarjoaa kaksi ratkaisua: kirjoita lause tai poista koodi, joka käyttää tietoa. Kun koodi tulee kirjastosta, sitä ei voi noin vain poistaa. Solysissa kirjoitin siis totuuden: "Solys ei käytä kuviasi. Tätä lupaa ei koskaan pyydetä." Valinta on käytännöllinen: seuraava build meni toimituksesta läpi, mutta en voi luvata, että Apple hyväksyy tämän lauseen aina.
Puuttuvien avainten löytäminen ennen lähetystä
Projektisi juuresta ajettuna tämä komento listaa ne kirjastojen tiedostot, joiden iOS-koodi viittaa tarkimmin valvottuihin rajapintoihin:
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
node_modules/*/ios node_modules/@*/*/ios
Jokainen nimi vastaa yhtä tietoa: PHPhotoLibrary kuvat, AVCaptureDevice kamera ja mikrofoni, CLLocationManager sijainti, CNContactStore yhteystiedot, EKEventStore kalenteri, ATTrackingManager seuranta. Tarkista jokaisen tuloksen kohdalla, että vastaava kuvausavain löytyy asetuksistasi.
Tämä verkko nappaa ne tapaukset, joihin olen itse törmännyt. Se ei korvaa Applen sähköpostin lukemista, joka on ainoa varma lista, aivan kuten ei-julkisten rajapintojen kohdalla ITMS-90338:ssa. Tämän hylkäyksen jälkeen ajan tarkistuksen ennen jokaista buildia: se vie muutaman sekunnin, kun taas ITMS-90683-hylkäys maksaa yhden buildin ja sen uudelleentekemiseen kuluvan ajan.
Lähetä buildisi ilman ikäviä yllätyksiä
ITMS-90683 korjautuu nopeasti, kun sen osaa lukea, aivan kuten ITMS-90725, joka koskee Xcoden versiota. Myöhemmin tulevat hylkäykset, reviewerin tekemät, vaativat enemmän harkintaa: toimintatapa löytyy sivulta Applen hylkäämä sovellus, ja yleisimmät syyt artikkelista miksi Apple hylkää sovelluksen.
Jos haluat tarkistaa kokonaisuuden ennen lähetystä, Apple Review Kit sisältää tarkistuslistani ja Claude Code -skillejä, jotka käyvät projektisi läpi. Jos lähetys jumittaa ja haluat ihmisen silmät asiaan, varaa tunti kanssani: käymme projektisi läpi videopuhelussa, sinun ruudullasi. Ja jos valmistelet ensimmäistä julkaisuasi, tee ilmainen diagnostiikka: se laittaa vaiheet oikeaan järjestykseen ja lähettää sinulle Applen hylkäysten välttämiseen tehdyn tarkistuslistani.
Usein kysytyt kysymykset
Onko ITMS-90683 App Review -hylkäys?
Ei siinä mielessä, että ihminen olisi sen tehnyt. Se on automaattinen tarkistus, joka tehdään buildille toimituksen yhteydessä ennen tarkastusta, aivan kuten ITMS-90717 kuvakkeen kohdalla. Kukaan ei ole avannut sovellustasi. Build hylätään: korjaa Info.plist ja lähetä uusi.
Miksi Apple vaatii avaimen tiedolle, jota sovellukseni ei käytä?
Koska Apple analysoi buildissa olevan koodin, ei sovelluksen toimintaa. Jos mukana oleva kirjasto viittaa kuvakirjastoon tai kameraan, kuvausavain vaaditaan, vaikka mikään näkymä ei koskaan pyytäisi tätä pääsyä.
Voiko ITMS-90683:n korjata etäpäivityksellä?
Ei. Puuttuva avain on Info.plistissä, joka on osa binääriä. Etäpäivitys ei muuta tätä tiedostoa: sinun pitää tehdä uusi build ja lähettää se Applelle.
Mihin NSPhotoLibraryUsageDescription lisätään Expo-projektissa?
Sovelluksesi asetuksiin kohtaan ios.infoPlist, ja mukaan lause, joka kuvaa käyttötarkoituksen. Jotkin kirjastot tarjoavat myös oman asetuksen pluginissaan, ja se voi lisätä muitakin avaimia, kuten taustatilan. Kummassakin tapauksessa avaimen pitää olla perusasetuksissa, ei pelkästään käännöstiedostoissa.
Pitääkö käyttämättömät kuvausavaimet poistaa?
Vain jos yksikään buildin kirjasto ei enää viittaa kyseiseen rajapintaan. Muuten seuraava lähetys hylätään koodilla ITMS-90683. Ennen kuin poistat avaimen, etsi rajapinnan nimeä riippuvuuksiesi iOS-koodista.