# ITMS-90683: betulkan “Missing purpose string” dengan Expo

> ITMS-90683 bermaksud Info.plist tiada purpose string. Tambah kunci yang disebut dalam e-mel Apple ke ios.infoPlist dalam app.json, kemudian buat build baharu.

Halaman asal: [ITMS-90683: betulkan “Missing purpose string” dengan Expo](https://devoria.fr/ms/blog/itms-90683-missing-purpose-string-expo)
Pengarang: [Mehdi Azizi](https://devoria.fr/ms/mehdi-azizi)
Diterbitkan: 2026-10-09
Semakan kandungan terakhir: 2026-10-09


ITMS-90683 ialah penolakan automatik daripada Apple: ia sampai melalui e-mel sejurus selepas anda menghantar build, sebelum sebarang semakan oleh manusia. Maksudnya, fail Info.plist anda tiada ayat yang menerangkan kenapa app mengakses data sensitif. **Pembetulannya cuma dua langkah: tambah kunci yang disebut dalam mesej ke `ios.infoPlist`, kemudian buat build semula.**

Saya terkena pada Solys, app jam loceng saya yang ada permainan mini, untuk data yang app itu langsung tidak guna. Ini maksud mesej tersebut, kenapa ia berlaku, dan cara mengelaknya.

## Apakah maksud ralat ITMS-90683?

Tajuk penuh mesej itu ialah "ITMS-90683: Missing purpose string in Info.plist". Ia memberitahu bahawa kod app anda merujuk API yang menyentuh data sensitif (foto, kamera, mikrofon, lokasi, kenalan), dan Info.plist anda tidak mengandungi kunci penerangan yang sepadan. Mesej itu menamakan kunci tersebut, contohnya `NSPhotoLibraryUsageDescription`.

Ayat penerangan ini dipanggil "purpose string". Itulah teks yang iOS paparkan dalam tetingkap permintaan kebenaran. Apple menulisnya dalam dokumentasi tentang [akses kepada sumber yang dilindungi](https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources): App Review menolak app yang kodnya mengakses sumber ini tanpa purpose string.

Ini bukan penolakan oleh reviewer. Semakan ini automatik dan berlaku semasa build dihantar, sebelum masuk semakan, sama seperti [ITMS-91053](https://devoria.fr/ms/blog/itms-91053-missing-api-declaration-expo) untuk privacy manifest. Build itu ditolak dan anda perlu hantar yang baharu.

## Kenapa Apple menolak walaupun app anda tidak guna data itu

Inilah yang mengejutkan. **Apple menganalisis kod dalam build anda, bukan apa yang app anda benar-benar buat.** Jika library yang anda sertakan mengandungi rujukan kepada pustaka foto, kunci itu diwajibkan, walaupun tiada skrin yang pernah meminta akses kepada foto. Mesej Apple sendiri menyatakannya: library atau SDK luaran boleh merujuk API ini, dan purpose string tetap wajib.

Kes saya, 26 September 2026. Semasa mengemas konfigurasi Solys, saya buang kunci `NSPhotoLibraryUsageDescription`, sebab app itu tidak menyentuh sebarang foto. Build seterusnya ditolak dengan ITMS-90683. Puncanya: dua library Expo yang digunakan app, `expo-image` dan `expo-file-system`, mengandungi kod yang merujuk pustaka foto. Build sebelumnya lulus kerana kunci itu masih ada.

**Pengajarannya**: kunci penerangan tidak dibuang "sebab kita tak guna". Ia hanya dibuang apabila tiada lagi library dalam build yang merujuk API tersebut.

## Kunci yang paling biasa

- `NSPhotoLibraryUsageDescription`: membaca atau menulis foto.
- `NSPhotoLibraryAddUsageDescription`: menambah foto, tanpa membaca.
- `NSCameraUsageDescription`: kamera.
- `NSMicrophoneUsageDescription`: mikrofon.
- `NSLocationWhenInUseUsageDescription`: lokasi semasa digunakan.
- `NSContactsUsageDescription`: kenalan.
- `NSUserTrackingUsageDescription`: penjejakan iklan ([App Tracking Transparency](https://devoria.fr/ms/blog/guideline-5-1-2-ai-pihak-ketiga-att-perkongsian-data)).

Apple menerangkan setiap kunci dalam dokumentasinya, contohnya untuk [NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/nsphotolibraryusagedescription): ia diwajibkan sebaik sahaja app menggunakan API yang membaca atau menulis ke pustaka foto.

## Membetulkan ITMS-90683 dalam app Expo

1. **Catat kunci yang disebut dalam e-mel Apple.** Mesej itu memberikan nama tepatnya.
2. **Tambahkannya dalam konfigurasi anda**, di bawah `ios.infoPlist`, seperti yang dinyatakan dalam [dokumentasi Expo tentang kebenaran](https://docs.expo.dev/guides/permissions/):

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "Solys tidak mengakses foto anda. Kebenaran ini tidak pernah diminta."
      }
    }
  }
}
```

3. **Buat build semula.** Expo menyatakannya: perubahan pada Info.plist tidak boleh dihantar melalui kemas kini jarak jauh, ia memerlukan binari baharu.
4. **Hantar semula build** kepada Apple, kemudian pilihnya dalam versi anda.

Satu perangkap jika app anda diterjemah: fail bahasa menterjemah kunci, ia tidak mengisytiharkannya. Kunci itu mesti wujud dahulu dalam `ios.infoPlist` (atau dalam konfigurasi plugin berkaitan). Jika tidak, app boleh crash pada panggilan pertama.

## Ayat apa yang patut ditulis jika app anda tidak guna data itu?

Apple meminta penerangan yang tepat, berguna dan jelas. Jika app anda benar-benar menggunakan data itu, nyatakan kegunaannya dalam satu ayat: "App ini menggunakan kamera untuk mengimbas kod bar tiket anda."

Jika kunci itu ada hanya kerana library, Apple memberi dua penyelesaian: tulis ayat itu, atau buang kod yang mengakses data tersebut. Apabila kod itu datang daripada library, anda tidak boleh membuangnya dengan mudah. Jadi untuk Solys, saya tulis perkara sebenar: "Solys tidak mengakses foto anda. Kebenaran ini tidak pernah diminta." Ini pilihan pragmatik: build seterusnya lulus semasa penghantaran, tetapi saya tidak boleh janji Apple akan sentiasa menerima ayat ini.

## Mengesan kunci yang tiada sebelum menghantar

Dari root projek anda, arahan ini menyenaraikan fail library yang kod iOSnya merujuk API yang paling dipantau:

```bash
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
  node_modules/*/ios node_modules/@*/*/ios
```

Setiap nama sepadan dengan satu jenis data: `PHPhotoLibrary` untuk foto, `AVCaptureDevice` untuk kamera dan mikrofon, `CLLocationManager` untuk lokasi, `CNContactStore` untuk kenalan, `EKEventStore` untuk kalendar, `ATTrackingManager` untuk penjejakan. Untuk setiap hasil, pastikan kunci penerangan yang sepadan wujud dalam konfigurasi anda.

Jaring ini menangkap kes yang pernah saya hadapi. Ia tidak menggantikan membaca e-mel Apple, yang kekal sebagai satu-satunya senarai yang pasti, sama seperti untuk API bukan awam dalam ITMS-90338. Sejak penolakan itu, semakan ini saya buat sebelum setiap build: ia ambil beberapa saat, sedangkan penolakan ITMS-90683 membazirkan satu build dan masa untuk membuatnya semula.

## Hantar build anda tanpa kejutan

ITMS-90683 cepat dibetulkan apabila anda tahu cara membacanya, sama seperti ITMS-90725, yang berkaitan versi Xcode. Penolakan yang datang selepas itu, daripada reviewer, memerlukan lebih banyak pertimbangan: langkah-langkahnya ada di halaman [app ditolak oleh Apple](https://devoria.fr/ms/expertise/aplikasi-ditolak-apple), dan sebab paling biasa ada dalam [kenapa Apple menolak app](https://devoria.fr/ms/blog/aplikasi-ditolak-apple-5-kes-sebenar).

Untuk menyemak fail anda sebelum menghantar, [Apple Review Kit](https://devoria.fr/ms/kits/review-apple) menghimpunkan senarai semak saya dan skill Claude Code yang menyemak projek anda. Jika penghantaran anda tersekat dan anda mahu pandangan manusia, [tempah satu jam dengan saya](https://devoria.fr/ms/coaching): kita semak projek anda melalui panggilan video, pada skrin anda. Dan jika anda sedang bersedia untuk pelancaran pertama, [buat diagnostik percuma anda](https://devoria.fr/ms/diagnostic): ia menyusun langkah mengikut urutan dan menghantar senarai semak anti-penolakan Apple saya kepada anda.

## Soalan lazim

### Adakah ITMS-90683 penolakan App Review?

Bukan dalam erti kata reviewer manusia. Ia semakan automatik pada build semasa dihantar, sebelum masuk semakan, sama seperti ITMS-90717 untuk ikon. Tiada sesiapa membuka app anda. Build itu ditolak: anda perlu betulkan Info.plist dan hantar build baharu.

### Kenapa Apple meminta kunci untuk data yang app saya tidak guna?

Kerana Apple menganalisis kod yang ada dalam build, bukan tingkah laku app. Jika library yang disertakan merujuk pustaka foto atau kamera, kunci penerangan diwajibkan, walaupun tiada skrin yang pernah meminta akses itu.

### Bolehkah ITMS-90683 dibetulkan dengan kemas kini jarak jauh?

Tidak. Kunci yang tiada itu terletak dalam Info.plist, yang merupakan sebahagian daripada binari. Kemas kini jarak jauh tidak mengubah fail ini: anda perlu buat build semula dan hantar kepada Apple.

### Di mana hendak menambah NSPhotoLibraryUsageDescription dalam projek Expo?

Dalam konfigurasi app anda, di bawah `ios.infoPlist`, dengan ayat yang menerangkan kegunaannya. Sesetengah library juga menyediakan tetapan khusus dalam plugin mereka, yang boleh menambah kunci lain, seperti mod latar belakang. Dalam kedua-dua kes, kunci itu mesti wujud dalam konfigurasi asas, bukan hanya dalam fail terjemahan.

### Perlukah kunci penerangan yang tidak digunakan dibuang?

Hanya jika tiada lagi library dalam build yang merujuk API berkenaan. Jika tidak, penghantaran seterusnya akan ditolak dengan ITMS-90683. Sebelum membuang kunci, cari nama API itu dalam kod iOS dependency anda.


## Projek anda

[Apple Review Kit](https://devoria.fr/ms/kits/review-apple): Senarai semak review App Store yang saya guna, penolakan Apple yang saya betulkan, nota untuk penguji dan dua skill Claude Code yang menyemak aplikasi anda. 29 €.

[iOS Kit](https://devoria.fr/ms/kits/ios): Bina aplikasi iPhone anda dengan Claude Code: kod permulaan aplikasi saya, skill yang menyemak kerjanya, serta Apple Review Kit, App Store Screenshots Kit dan ASO Kit. 129,99 €.
