ITMS-90683: atasi “Missing purpose string” di Expo
Oleh Mehdi Azizi
Terbit , 6 mnt
ITMS-90683 Missing purpose string: kenapa Apple menolak build kamu, key apa yang ditambahkan di app.json Expo, dan cara mendeteksinya sebelum dikirim.
ITMS-90683 adalah penolakan otomatis dari Apple: datang lewat e-mail tak lama setelah kamu mengirim build, sebelum ada review oleh manusia. Artinya, di file Info.plist kamu tidak ada kalimat yang menjelaskan kenapa app mengakses data sensitif. Perbaikannya cuma dua langkah: tambahkan key yang disebut di pesan ke ios.infoPlist, lalu build ulang.
Saya kena ini di Solys, app alarm saya yang pakai mini-game, untuk data yang bahkan tidak dipakai app-nya. Berikut arti pesannya, kenapa bisa muncul, dan cara menghindarinya.
Apa arti error ITMS-90683?
Judul lengkap pesannya "ITMS-90683: Missing purpose string in Info.plist". Isinya: kode app kamu merujuk ke API yang menyentuh data sensitif (foto, kamera, mikrofon, lokasi, kontak), dan Info.plist kamu tidak punya key deskripsi yang sesuai. Pesan itu menyebut nama key-nya, misalnya NSPhotoLibraryUsageDescription.
Kalimat deskripsi ini disebut "purpose string". Inilah teks yang ditampilkan iOS di jendela permintaan izin. Apple menulisnya di dokumentasi tentang akses ke resource yang dilindungi: App Review menolak app yang kodenya mengakses resource ini tanpa purpose string.
Ini bukan penolakan dari reviewer. Pengecekannya otomatis dan terjadi saat build dikirim, sebelum masuk review, sama seperti ITMS-91053 untuk privacy manifest. Build-nya dibuang dan kamu harus mengirim yang baru.
Kenapa Apple menolak padahal app kamu tidak memakai data itu
Ini bagian yang mengejutkan. Apple menganalisis kode di dalam build kamu, bukan apa yang benar-benar dilakukan app kamu. Kalau ada library yang kamu sertakan merujuk ke galeri foto, key-nya tetap wajib, walaupun tidak ada satu layar pun yang meminta akses ke foto. Pesan Apple sendiri menyebutkannya: library atau SDK eksternal bisa merujuk ke API ini, dan purpose string tetap wajib.
Kasus saya, 26 September 2026. Waktu merapikan konfigurasi Solys, saya menghapus key NSPhotoLibraryUsageDescription, karena app-nya tidak menyentuh foto sama sekali. Build berikutnya ditolak dengan ITMS-90683. Penyebabnya: dua library Expo yang dipakai app ini, expo-image dan expo-file-system, berisi kode yang merujuk ke galeri foto. Build sebelumnya lolos karena key-nya masih ada.
Pelajarannya: key deskripsi jangan dihapus "karena tidak dipakai". Hapus hanya kalau sudah tidak ada lagi library di build yang merujuk ke API tersebut.
Key yang paling umum
NSPhotoLibraryUsageDescription: membaca atau menulis foto.NSPhotoLibraryAddUsageDescription: menambah foto, tanpa membaca.NSCameraUsageDescription: kamera.NSMicrophoneUsageDescription: mikrofon.NSLocationWhenInUseUsageDescription: lokasi saat app dipakai.NSContactsUsageDescription: kontak.NSUserTrackingUsageDescription: pelacakan iklan (App Tracking Transparency).
Apple menjelaskan setiap key di dokumentasinya, misalnya untuk NSPhotoLibraryUsageDescription: key ini wajib begitu app memakai API yang membaca atau menulis ke galeri foto.
Memperbaiki ITMS-90683 di app Expo
- Catat key yang disebut di e-mail Apple. Pesannya memberi nama yang persis.
- Tambahkan ke konfigurasi kamu, di bawah
ios.infoPlist, sesuai dokumentasi Expo tentang izin:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Solys tidak mengakses foto kamu. Izin ini tidak pernah diminta."
}
}
}
}
- Build ulang. Expo menegaskan: perubahan Info.plist tidak bisa lewat update jarak jauh, perlu binary baru.
- Kirim ulang build ke Apple, lalu pilih build itu di versi kamu.
Satu jebakan kalau app kamu diterjemahkan: file bahasa hanya menerjemahkan key, tidak mendeklarasikannya. Key-nya harus lebih dulu ada di ios.infoPlist (atau di konfigurasi plugin terkait). Kalau tidak, app bisa crash saat pemanggilan pertama.
Kalimat apa yang ditulis kalau app kamu tidak memakai data itu?
Apple meminta deskripsi yang akurat, berguna, dan spesifik. Kalau app kamu memang memakai data itu, sebutkan kegunaannya dalam satu kalimat: "App ini memakai kamera untuk memindai barcode tiket kamu."
Kalau key-nya ada hanya karena sebuah library, Apple memberi dua solusi: tulis kalimatnya, atau hapus kode yang mengakses data itu. Kalau kodenya berasal dari library, kamu tidak bisa begitu saja menghapusnya. Jadi di Solys saya menulis yang sebenarnya: "Solys tidak mengakses foto kamu. Izin ini tidak pernah diminta." Ini pilihan pragmatis: build berikutnya lolos saat pengiriman, tapi saya tidak bisa menjamin Apple akan selalu menerima kalimat ini.
Mendeteksi key yang hilang sebelum mengirim
Dari root proyek kamu, perintah ini menampilkan file library yang kode iOS-nya merujuk ke API yang paling diawasi:
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
node_modules/*/ios node_modules/@*/*/ios
Setiap nama mewakili satu jenis data: PHPhotoLibrary untuk foto, AVCaptureDevice untuk kamera dan mikrofon, CLLocationManager untuk lokasi, CNContactStore untuk kontak, EKEventStore untuk kalender, ATTrackingManager untuk pelacakan. Untuk setiap hasil, pastikan key deskripsi yang sesuai ada di konfigurasi kamu.
Saringan ini menangkap kasus-kasus yang pernah saya alami. Tapi ini tidak menggantikan membaca e-mail Apple, yang tetap satu-satunya daftar yang pasti, sama seperti untuk API non-publik di ITMS-90338. Sejak penolakan itu, pengecekan ini selalu saya jalankan sebelum setiap build: cuma beberapa detik, sedangkan penolakan ITMS-90683 menghabiskan satu build dan waktu untuk mengulangnya.
Kirim build tanpa kejutan
ITMS-90683 cepat diperbaiki kalau kamu tahu cara membacanya, sama seperti ITMS-90725 yang menyangkut versi Xcode. Penolakan berikutnya, yang dari reviewer, butuh pemikiran lebih: langkah-langkahnya ada di halaman app ditolak Apple, dan alasan yang paling sering ada di kenapa Apple menolak app.
Untuk mengecek berkas kamu sebelum mengirim, Apple Review Kit berisi checklist saya dan skill Claude Code yang memeriksa proyek kamu. Kalau pengirimanmu macet dan kamu ingin pendapat manusia, booking satu jam dengan saya: kita bedah proyek kamu lewat video call, langsung di layar kamu. Dan kalau kamu sedang menyiapkan rilis pertama, ikuti diagnostic gratis: urutan langkahnya dirapikan dan kamu dapat checklist anti-penolakan Apple dari saya.
Pertanyaan umum
Apakah ITMS-90683 penolakan dari App Review?
Bukan dalam arti reviewer manusia. Ini pengecekan otomatis pada build saat dikirim, sebelum masuk review, sama seperti ITMS-90717 untuk ikon. Tidak ada yang membuka app kamu. Build-nya dibuang: kamu harus memperbaiki Info.plist dan mengirim build baru.
Kenapa Apple meminta key untuk data yang tidak dipakai app saya?
Karena Apple menganalisis kode yang ada di build, bukan perilaku app. Kalau ada library yang disertakan merujuk ke galeri foto atau kamera, key deskripsinya wajib, walaupun tidak ada layar yang pernah meminta akses itu.
Bisakah ITMS-90683 diperbaiki dengan update jarak jauh?
Tidak. Key yang hilang ada di Info.plist, yang merupakan bagian dari binary. Update jarak jauh tidak mengubah file ini: kamu harus build ulang dan mengirimnya lagi ke Apple.
Di mana menambahkan NSPhotoLibraryUsageDescription di proyek Expo?
Di konfigurasi app kamu, di bawah ios.infoPlist, dengan kalimat yang menjelaskan penggunaannya. Beberapa library juga menyediakan pengaturan khusus di plugin-nya, yang bisa menambahkan key lain, seperti background mode. Apa pun caranya, key-nya harus ada di konfigurasi dasar, bukan hanya di file terjemahan.
Perlukah menghapus key deskripsi yang tidak dipakai?
Hanya kalau sudah tidak ada library di build yang merujuk ke API terkait. Kalau tidak, pengiriman berikutnya akan ditolak dengan ITMS-90683. Sebelum menghapus key, cari nama API-nya di kode iOS dependensi kamu.