# ITMS-91053 Missing API declaration hatası: Expo ile çözüm

> ITMS-91053: build'in gerekçe zorunlu bir API'yi beyan etmeden kullanıyor. Kategorisini ve kodunu ios.privacyManifests'e ekle, sonra yeniden build al.

Orijinal sayfa: [ITMS-91053 Missing API declaration hatası: Expo ile çözüm](https://devoria.fr/tr/blog/itms-91053-missing-api-declaration-expo)
Yazar: [Mehdi Azizi](https://devoria.fr/tr/mehdi-azizi)
Yayın: 2026-10-25
İçeriğin son gözden geçirilmesi: 2026-10-25


ITMS-91053, Apple'ın otomatik bir kontrolü. [Build'ini gönderdikten](https://devoria.fr/tr/blog/eas-submit-ios-expo-app-store-yayinlama) sonra e-postayla gelir. Uygulamanın kodunun "gerekçe zorunlu" bir API kullandığını (tercihler, dosya tarihleri, açılıştan beri geçen süre, disk alanı veya klavyeler), ama gizlilik manifestinde nedenini açıklamadığını söyler. **Expo'da düzeltme `ios.privacyManifests` içinde yapılır: Apple'ın belirttiği kategori, gerçek kullanımını anlatan kod, ardından yeni bir build.**

Mini oyunlu alarm uygulamam Solys'te bu gerekçeler uygulamanın yapılandırmasında beyan ediliyor. Aşağıda gerçek beyanını, bağımlılıklarının neleri kullandığını listeleyen komutu ve göndermeden önce son dosyada yapman gereken kontrolü bulacaksın.

## ITMS-91053 hatası ne demek?

Mesajın başlığı "ITMS-91053: Missing API declaration". Build'indeki belirli bir dosyanın kodunun, gerekçe isteyen bir veya birden fazla API'ye başvurduğunu söyler. Ardından ilgili kategorileri listeler, örneğin `NSPrivacyAccessedAPICategoryUserDefaults`.

Bu API'ler kullanıcıdan hiçbir izin istemez. Ama bir cihazı tanımak için kullanılabilirler, Apple buna fingerprinting diyor. Bu, kullanıcı takibi kabul etse bile yasak. Apple bunu [gerekçe zorunlu API'ler](https://developer.apple.com/documentation/bundleresources/describing-use-of-required-reason-api) sayfasında açıklıyor: her uygulama ve her SDK bunları neden kullandığını beyan etmek zorunda.

Aynı sayfa kuralı da koyuyor: **1 Mayıs 2024'ten beri App Store Connect, bu kullanımları manifestinde açıklamayan bir uygulamayı kabul etmiyor.** Bazı geliştiriciler bu e-postayı kabul edilmiş bir build'de basit bir uyarı olarak aldıklarını anlattı. Buna güvenme: bunu bir engel olarak gör ve bir sonraki gönderimden önce düzelt.

Diğer ITMS hataları gibi bu da bir reviewer'ın reddi değil. Kimse uygulamanı açmadı: Apple binary'yi analiz etti.

## iOS privacy manifest: PrivacyInfo.xcprivacy dosyası

Gizlilik manifesti, uygulama bundle'ının köküne yerleştirilen `PrivacyInfo.xcprivacy` adlı bir dosya. [Apple'ın privacy manifest belgelerine](https://developer.apple.com/documentation/bundleresources/privacy-manifest-files) göre toplanan verileri, takibi ve gerekçe zorunlu API'leri tanımlar. Bu API'ler `NSPrivacyAccessedAPITypes` dizisine girer: her kategori için bir kayıt, türü ve gerekçe listesiyle birlikte.

Tuzak şu: **bir manifest yalnızca kendi bundle'ını kapsar.** Apple bunu açıkça yazıyor: bu API'leri kullanan her çalıştırılabilir dosya veya dinamik kütüphanenin kendi bundle'ında bir manifesti olmalı. Uygulamanın manifesti gömülü bir framework'ü kapsamaz, bir SDK da uygulamanın manifestine güvenemez.

Bunu [ITMS-90683](https://devoria.fr/tr/blog/itms-90683-missing-purpose-string-expo) hatasının istediği Info.plist cümleleriyle karıştırma. Onlar bir izin isteğinde kullanıcıya gösterilir. Manifesti ise sadece Apple okur.

## 5 API kategorisi ve gerekçe kodları

Bir kategorinin tam adı `NSPrivacyAccessedAPICategory` ile başlar. API'lerin ve gerekçelerin listesi [NSPrivacyAccessedAPIType](https://developer.apple.com/documentation/bundleresources/app-privacy-configuration/nsprivacyaccessedapitypes/nsprivacyaccessedapitype) anahtarının sayfasında, 15 Ekim 2026'da okundu.

| Kategori        | Tipik API                    | Yaygın gerekçe |
| --------------- | ---------------------------- | -------------- |
| UserDefaults    | `UserDefaults`               | CA92.1         |
| FileTimestamp   | `creationDate`               | C617.1         |
| SystemBootTime  | `systemUptime`               | 35F9.1         |
| DiskSpace       | `volumeAvailableCapacityKey` | E174.1         |
| ActiveKeyboards | `activeInputModes`           | 54BD.1         |

En sık karşılaşacağın kodlar:

- **CA92.1**: uygulama, diğer uygulamaların erişemediği kendi tercihlerini okur ve yazar.
- **1C8F.1**: aynı App Group'taki bir widget veya extension ile paylaşılan tercihler.
- **C617.1**: uygulamanın container'ında duran dosyaların tarihleri veya boyutu.
- **3B52.1**: kullanıcının seçtiği dosyalar, örneğin bir belge seçicide.
- **35F9.1**: uygulamadaki iki olay arasında geçen süreyi ölçmek veya bir zamanlayıcı çalıştırmak.
- **E174.1**: dosya yazmadan önce boş alanı kontrol etmek, kullanıcının göreceği bir etkiyle.
- **85F4.1**: disk alanını kullanıcıya göstermek.

**En geniş görünen gerekçeyi değil, gerçek kullanımına uyan gerekçeyi beyan et.** Apple bu API'lerin ve verilerinin yalnızca beyan edilen gerekçeler için kullanıldığını, asla takip için kullanılmadığını belirtiyor. İki kod üçüncü taraf SDK'lara ayrılmış: C56D.1 ve 0A2A.1. Uygulamanın manifestinde yerleri yok.

## Expo'da privacy manifest beyanı

Expo'da dosyayı kendin yazmıyorsun. app.json veya app.config içinde `expo.ios.privacyManifests` altında tanımlıyorsun, prebuild da `PrivacyInfo.xcprivacy` dosyasını üretiyor. Bu, [Expo'nun privacy manifest belgelerindeki](https://docs.expo.dev/guides/apple-privacy/) yöntem.

İşte Solys yapılandırmasından gerçek bir alıntı. Anahtar takibi ve toplanan verileri de içeriyor, burada çıkarıldılar:

```json
{
  "expo": {
    "ios": {
      "privacyManifests": {
        "NSPrivacyAccessedAPITypes": [
          {
            "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults",
            "NSPrivacyAccessedAPITypeReasons": ["CA92.1", "1C8F.1"]
          },
          {
            "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryFileTimestamp",
            "NSPrivacyAccessedAPITypeReasons": ["C617.1"]
          },
          {
            "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategorySystemBootTime",
            "NSPrivacyAccessedAPITypeReasons": ["35F9.1"]
          }
        ]
      }
    }
  }
}
```

CA92.1, C617.1 ve 35F9.1, React Native'in ve uygulamadaki Expo modüllerinin beyan ettiklerini tekrarlıyor. 1C8F.1 ise doğrudan Solys'ten geliyor: uygulama bazı ayarları widget'ıyla bir App Group üzerinden paylaşıyor.

Bilmen gereken bir tuzak: `ios` klasörün üretiliyor ve git tarafından yok sayılıyorsa, **bu klasöre elle yazılmış bir `PrivacyInfo.xcprivacy` build'e asla ulaşmaz.** EAS prebuild'i yeniden çalıştırır ve klasörü baştan üretir. Bunu 9 Eylül 2026'da projelerimden birinde gördüm: elle yazdığım manifest bir prebuild'den sonra kaybolmuştu. Beyan yapılandırmada durmalı.

Son nokta: manifest binary'nin bir parçası. Uzaktan bir güncelleme onu değiştirmez. Yeniden build alıp tekrar göndermen gerekir.

## Kendi manifestini içeren üçüncü taraf SDK'lar

Yeni kütüphanelerin çoğu kendi manifestini getiriyor. Bu API'leri kullanan Expo paketlerinin `ios` klasöründe bir `PrivacyInfo.xcprivacy` var, React Native'de de öyle. Sorun, bunların uygulamana nasıl bağlandığından kaynaklanıyor.

Expo belgeleri uyarıyor: Apple, statik olarak bağlanan CocoaPods bağımlılıklarının manifestlerini her zaman doğru okumuyor, Expo paketleri de bu durumda. Bu yüzden onların gerekçelerini uygulamanın yapılandırmasına kopyalaman gerekebilir.

Bu işi azaltmak için [expo-build-properties](https://docs.expo.dev/versions/latest/sdk/build-properties/) içindeki `ios.privacyManifestAggregationEnabled` ayarı, CocoaPods bağımlılıklarının manifestlerini tek bir dosyada birleştirir. Expo'nun projelerimde ürettiği Podfile'da (SDK 57) bu birleştirme, sen kapatmadıkça açık.

Birleştirmenin bir sınırı var: yalnızca manifest sağlayan bağımlılıkları görür. Manifesti olmayan eski bir kütüphane görünmez kalır. **O yüzden e-postada belirtilen dosya yolunu oku**: nerede düzelteceğini o söyler.

| Belirtilen dosya                     | Nerede düzeltilir      |
| ------------------------------------ | ---------------------- |
| Uygulamanın çalıştırılabilir dosyası | `ios.privacyManifests` |
| Bir `.framework`                     | SDK'yı güncelle        |
| Bir `.appex` extension'ı             | Extension'ın manifesti |

## Göndermeden önce kontrol et

Expo, bir gönderimden sonra Apple'ın e-postasını beklemeyi öneriyor. İşe yarıyor, ama her gidiş-dönüş bir build'e mal oluyor. İşte benim önceden yaptığım dört kontrol.

**1. Bağımlılıklarının neleri beyan ettiğini listele.** Projenin kökünden:

```bash
find node_modules -name PrivacyInfo.xcprivacy -not -path '*/example/*' \
  -exec grep -ho "NSPrivacyAccessedAPICategory[A-Za-z]*" {} + | sort | uniq -c
```

Solys'te 15 Ekim 2026'da komut 13 manifest ve dört kategori buluyor: dosya tarihleri, tercihler, açılıştan beri geçen süre ve disk alanı. Listelenen her kategori, uygulamanın son manifestinde ya da onu kullanan framework'ün manifestinde yer almalı.

**2. Kendi native kodunda ara.** Kendi modüllerin, plugin'ler, widget gibi target'lar: bu kodu hiçbir SDK senin yerine beyan etmez.

```bash
grep -rlE "UserDefaults|systemUptime|mach_absolute_time|creationDate|modificationDate|volumeAvailableCapacity|activeInputModes" \
  --include='*.swift' --include='*.m' --include='*.mm' modules plugins targets
```

Klasörleri projene göre uyarla. Solys'te App Group ile paylaşılan tercihleri ortaya çıkaran bu arama oldu, 1C8F.1 kodu da buradan geliyor.

**3. Üretilen manifesti oku.** `npx expo prebuild -p ios` komutunu çalıştır, sonra `ios/<NomDeTonApp>/PrivacyInfo.xcprivacy` dosyasını aç. Dikkat: bu komut `ios` klasörünü silip yeniden oluşturabilir. Orada elle değişiklik yaptıysan projenin bir kopyası üzerinde çalış.

**4. Son build'i kontrol et.** Önemli olan tek kanıt bu. IPA'yı expo.dev'deki build sayfasından indir, sonra Mac'inde şunu çalıştır:

```bash
unzip -q MonApp.ipa -d ipa
find ipa/Payload -name PrivacyInfo.xcprivacy
plutil -p ipa/Payload/*.app/PrivacyInfo.xcprivacy
```

İkinci satır gömülü tüm manifestleri listeler: uygulamanınkini ve framework'lerinkileri. Üçüncüsü uygulamanın manifestini gösterir, 1. adımdaki listeyle karşılaştır.

## Manifestin App Store sayfanla uyumlu olması

Manifest tek başına yaşamaz. Takip veya toplanan veri beyan ediyorsa, App Store sayfan ve gizlilik politikan da aynı şeyi söylemeli. Üçü arasındaki bir uyumsuzluk sonradan [guideline 5.1.1](https://devoria.fr/tr/blog/guideline-5-1-1-app-store-ret) kapsamında bir insan reddine yol açabilir. Neyin uyumlu olması gerektiği [bir uygulamanın gizlilik politikası](https://devoria.fr/tr/blog/uygulama-gizlilik-politikasi-ios-rehberi) yazısında anlatılıyor.

## Build'ini sürprizsiz gönder

ITMS hataları, okumayı bilince hızlı düzelir. Sonrasında gelen redler daha fazla mesafe ister: izlenecek yol [Apple tarafından reddedilen uygulama](https://devoria.fr/tr/expertise/apple-tarafindan-reddedilen-uygulama) sayfasında, en sık nedenler 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ıyorsa ve bir insan gözü istiyorsan, [benimle bir saat ayır](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 redlerine karşı kontrol listemi gönderir.

## Sık sorulan sorular

### ITMS-91053 build'imin gönderimini engeller mi?

Apple, 1 Mayıs 2024'ten beri App Store Connect'in bu API'lerin kullanımını açıklamayan uygulamaları kabul etmediğini yazıyor. Yine de bazı geliştiriciler e-postayı kabul edilmiş bir build'de, uyarı olarak aldı. Her iki durumda da manifesti bir sonraki build'den önce düzelt.

### UserDefaults için hangi gerekçe kodunu seçmeliyim?

Uygulama yalnızca kendi tercihlerini okuyup yazıyorsa CA92.1. Bunları bir App Group üzerinden bir widget veya extension ile paylaşıyorsa 1C8F.1'i de ekle. C56D.1 üçüncü taraf SDK'lara ayrılmış: uygulamanın manifestine koyma.

### Her SDK'nın manifestini app.json'a kopyalamak gerekir mi?

Şart değil. Manifest birleştirme açıksa, CocoaPods bağımlılıklarının manifestleri pod kurulumunda bir araya getirilir. Bir kategoriyi yalnızca son manifestte eksikse, gerçek kullanımı anlatan gerekçeyle kopyala.

### Widget'ımın veya extension'ımın kendi manifesti olmalı mı?

Apple'a göre bu API'leri kullanan bir çalıştırılabilir dosya içeren her bundle'ın kendi manifesti olmalı. Bir extension, kendi bundle'ında ayrı bir çalıştırılabilir dosyadır: uygulamanın manifesti onu kapsamaz.

### ITMS-91053 yeniden build almadan düzeltilebilir mi?

Hayır. Gizlilik manifesti binary'nin bir parçası. Yapılandırmayı düzelt, yeniden build al, ardından incelemeye göndermeden önce [TestFlight](https://devoria.fr/tr/blog/testflight-iphone-uygulama-test-etme) üzerinde test et.


## 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 €.
