# ITMS-90683: Expo ile “Missing purpose string” çözümü

> ITMS-90683 Missing purpose string: Apple build'ini neden reddeder, Expo'da app.json'a hangi anahtarı eklersin, eksik anahtarları göndermeden önce nasıl bulursun.

Orijinal sayfa: [ITMS-90683: Expo ile “Missing purpose string” çözümü](https://devoria.fr/tr/blog/itms-90683-missing-purpose-string-expo)
Yazar: [Mehdi Azizi](https://devoria.fr/tr/mehdi-azizi)
Yayın: 2026-10-09
İçeriğin son gözden geçirilmesi: 2026-10-09


ITMS-90683, Apple'ın otomatik bir reddi. Build'i gönderdikten kısa süre sonra, hiçbir insan incelemesinden önce e-postayla gelir. Anlamı şu: Info.plist dosyanda, uygulamanın hassas bir veriye neden eriştiğini açıklayan cümle eksik. **Düzeltmesi iki adım: mesajda geçen anahtarı `ios.infoPlist` içine ekle, sonra yeni bir build al.**

Ben bu hatayı mini oyunlu alarm uygulamam Solys'te, uygulamanın kullanmadığı bir veri yüzünden bile aldım. Mesajın ne dediğini, neden geldiğini ve nasıl önleyeceğini anlatayım.

## ITMS-90683 hatası ne anlama geliyor?

Mesajın tam başlığı "ITMS-90683: Missing purpose string in Info.plist". Uygulamanın kodunun hassas verilere (fotoğraflar, kamera, mikrofon, konum, kişiler) dokunan bir API'ye referans verdiğini, ama Info.plist'inde ilgili açıklama anahtarının olmadığını söyler. Mesaj bu anahtarın adını verir, örneğin `NSPhotoLibraryUsageDescription`.

Bu açıklama cümlesine "purpose string" denir. iOS'un izin isteme penceresinde gösterdiği metindir. Apple bunu [korunan kaynaklara erişim](https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources) dokümantasyonunda açıkça yazar: App Review, kodu bu kaynaklara purpose string olmadan erişen uygulamaları reddeder.

Bu bir reviewer reddi değil. Kontrol otomatik ve build teslim edilirken, incelemeye girmeden önce yapılır; gizlilik manifestosu için [ITMS-91053](https://devoria.fr/tr/blog/itms-91053-missing-api-declaration-expo) gibi. Build elenir ve yenisini göndermen gerekir.

## Uygulaman bu veriyi kullanmasa bile Apple neden reddeder?

Şaşırtan nokta bu. **Apple, uygulamanın gerçekte ne yaptığını değil, build'indeki kodu analiz eder.** Eklediğin bir kütüphane fotoğraf arşivine referans içeriyorsa, hiçbir ekran fotoğraf erişimi istemese bile anahtar zorunludur. Apple'ın mesajı da bunu belirtir: harici bir kütüphane ya da SDK bu API'lere referans verebilir ve purpose string yine zorunludur.

Benim durumum, 26 Eylül 2026. Solys'in yapılandırmasını temizlerken, uygulama hiçbir fotoğrafa dokunmadığı için `NSPhotoLibraryUsageDescription` anahtarını kaldırmıştım. Sonraki build ITMS-90683 ile reddedildi. Sebep: uygulamanın kullandığı iki Expo kütüphanesi, `expo-image` ve `expo-file-system`, fotoğraf arşivine referans veren kod içeriyor. Önceki build geçiyordu, çünkü anahtar hâlâ oradaydı.

**Ders**: bir açıklama anahtarı "kullanmıyoruz" diye kaldırılmaz. Ancak build'deki hiçbir kütüphane artık o API'ye referans vermiyorsa kaldırılır.

## En yaygın anahtarlar

- `NSPhotoLibraryUsageDescription`: fotoğrafları okuma veya yazma.
- `NSPhotoLibraryAddUsageDescription`: okumadan fotoğraf ekleme.
- `NSCameraUsageDescription`: kamera.
- `NSMicrophoneUsageDescription`: mikrofon.
- `NSLocationWhenInUseUsageDescription`: kullanım sırasında konum.
- `NSContactsUsageDescription`: kişiler.
- `NSUserTrackingUsageDescription`: reklam takibi ([App Tracking Transparency](https://devoria.fr/tr/blog/guideline-5-1-2-ucuncu-taraf-yapay-zeka-att-veri-paylasimi)).

Apple her anahtarı dokümantasyonunda anlatır, örneğin [NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/nsphotolibraryusagedescription) sayfası: uygulama fotoğraf arşivini okuyan veya ona yazan bir API kullandığı anda bu anahtar zorunlu.

## Bir Expo uygulamasında ITMS-90683'ü düzeltmek

1. **Apple'ın e-postasında geçen anahtarı not al.** Mesaj tam adını verir.
2. **Onu yapılandırmana ekle**, `ios.infoPlist` altına, [Expo'nun izinler dokümantasyonunda](https://docs.expo.dev/guides/permissions/) anlatıldığı gibi:

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "Solys fotoğraflarına erişmez. Bu izin hiçbir zaman istenmez."
      }
    }
  }
}
```

3. **Yeni bir build al.** Expo bunu belirtir: Info.plist değişikliği uzaktan güncellemeyle gitmez, yeni bir binary gerektirir.
4. **Build'i Apple'a yeniden gönder**, sonra sürümünde onu seç.

Uygulaman çevrilmişse bir tuzak var: dil dosyaları bir anahtarı çevirir, onu tanımlamaz. Anahtar önce `ios.infoPlist` içinde (ya da ilgili plugin'in yapılandırmasında) var olmalı. Yoksa uygulama ilk çağrıda çökebilir.

## Uygulaman veriyi kullanmıyorsa ne yazmalısın?

Apple doğru, faydalı ve net bir açıklama ister. Uygulaman veriyi gerçekten kullanıyorsa, ne işe yaradığını tek cümleyle söyle: "Uygulama, biletinin barkodunu taramak için kamerayı kullanır."

Anahtar sadece bir kütüphane yüzünden oradaysa, Apple iki çözüm sunar: cümleyi yazmak ya da veriye erişen kodu kaldırmak. Bu kod bir kütüphaneden geliyorsa onu kolayca kaldıramazsın. Solys'te ben de gerçeği yazdım: "Solys fotoğraflarına erişmez. Bu izin hiçbir zaman istenmez." Bu pragmatik bir tercih: sonraki build teslimde geçti, ama Apple'ın bu cümleyi her zaman kabul edeceğini sana söyleyemem.

## Eksik anahtarları göndermeden önce bulmak

Projenin kök dizininden bu komut, iOS kodu en çok denetlenen API'lere referans veren kütüphane dosyalarını listeler:

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

Her isim bir veriye karşılık gelir: fotoğraflar için `PHPhotoLibrary`, kamera ve mikrofon için `AVCaptureDevice`, konum için `CLLocationManager`, kişiler için `CNContactStore`, takvim için `EKEventStore`, takip için `ATTrackingManager`. Her sonuç için ilgili açıklama anahtarının yapılandırmanda olduğunu kontrol et.

Bu ağ, karşılaştığım durumları yakalıyor. Ama Apple'ın e-postasını okumanın yerini tutmaz; tek güvenilir liste o, tıpkı ITMS-90338 için herkese açık olmayan API'lerde olduğu gibi. Bu retten beri bu kontrolü her build'den önce yapıyorum: birkaç saniye sürüyor, oysa bir ITMS-90683 reddi bir build'e ve onu yeniden almanın süresine mal oluyor.

## Build'ini sürprizsiz göndermek

ITMS-90683, nasıl okunacağını bilince hızla düzelir; Xcode sürümünü hedefleyen ITMS-90725 gibi. Sonra gelen retler, yani reviewer retleri, daha fazla soğukkanlılık ister: yol haritası [Apple tarafından reddedilen uygulama](https://devoria.fr/tr/expertise/apple-tarafindan-reddedilen-uygulama) sayfasında, en sık gerekçeler de [Apple bir uygulamayı neden reddeder](https://devoria.fr/tr/blog/apple-uygulama-reddi-neden-reddedilir) yazısında.

Göndermeden önce dosyanı kontrol etmek için [Apple Review Kit](https://devoria.fr/tr/kits/review-apple), kontrol listemi ve projeni okuyan Claude Code skill'lerini bir araya getiriyor. Gönderimin takılırsa ve bir insanın bakmasını istersen, [benimle bir saatlik görüşme ayarla](https://devoria.fr/tr/coaching): projeni görüntülü görüşmede, senin ekranında birlikte ele alırız. İlk yayınına hazırlanıyorsan da [ücretsiz tanılamanı yap](https://devoria.fr/tr/diagnostic): adımları sıraya koyar ve sana Apple retlerine karşı kontrol listemi gönderir.

## Sık sorulan sorular

### ITMS-90683 bir App Review reddi mi?

İnsan bir reviewer anlamında değil. Build teslim edilirken, incelemeye girmeden önce yapılan otomatik bir kontrol; simge için ITMS-90717 gibi. Kimse uygulamanı açmadı. Build elenir: Info.plist'i düzeltip yenisini göndermen gerekir.

### Apple neden uygulamamın kullanmadığı bir veri için anahtar istiyor?

Çünkü Apple uygulamanın davranışını değil, build'deki kodu analiz eder. Eklenen bir kütüphane fotoğraf arşivine ya da kameraya referans veriyorsa, hiçbir ekran bu erişimi istemese bile açıklama anahtarı zorunludur.

### ITMS-90683 uzaktan güncellemeyle düzeltilebilir mi?

Hayır. Eksik anahtar, binary'nin parçası olan Info.plist içinde. Bir uzaktan güncelleme bu dosyayı değiştirmez: yeni bir build alıp Apple'a göndermen gerekir.

### Bir Expo projesinde NSPhotoLibraryUsageDescription nereye eklenir?

Uygulama yapılandırmanda, `ios.infoPlist` altına, kullanımı açıklayan bir cümleyle. Bazı kütüphaneler plugin'lerinde ayrı bir ayar da sunar; bu ayar arka plan modu gibi başka anahtarlar da ekleyebilir. Her iki durumda da anahtar sadece çeviri dosyalarında değil, temel yapılandırmada da bulunmalı.

### Kullanılmayan açıklama anahtarlarını kaldırmak gerekir mi?

Yalnızca build'deki hiçbir kütüphane artık ilgili API'ye referans vermiyorsa. Yoksa bir sonraki gönderim ITMS-90683 ile reddedilir. Bir anahtarı kaldırmadan önce, bağımlılıklarının iOS kodunda API'nin adını ara.


## Projen

[Apple Review Kit](https://devoria.fr/tr/kits/review-apple): Kullandığım App Store inceleme kontrol listesi, düzelttiğim Apple retleri, inceleyici notları ve uygulamanı inceleyen iki Claude Code skill'i. 29 €.

[iOS Kit](https://devoria.fr/tr/kits/ios): Claude Code ile iPhone uygulamanı yap: uygulamalarımın başlangıç kodu, işini kontrol eden skill'ler, Apple Review, Screenshots ve ASO kitleri. 129,99 €.
