Guideline 2.5.1: Expo ile public API ve güncel SDK
Yazan: Mehdi Azizi
tarihinde yayınlandı, 9 dk.
Guideline 2.5.1: yalnızca public API, güncel iOS ile uyum ve her framework kendi amacı için. Expo kullanıyorsan önce native modüllerini kontrol et.
Guideline 2.5.1 dört şart koyuyor: yalnızca public API kullanmak, güncel iOS sürümünde çalışmak, Apple'ın kullanımdan kaldırdığı şeyleri bırakmak ve her framework'ü kendi amacı için kullanmak. Expo'da risk nadiren JavaScript kodundan gelir: kurduğun native modüllerden ve derlediğin SDK'dan gelir.
Solys, TradaZen ve Nolera'yı Expo SDK 57 ile yayınlıyorum. Solys, Apple'ın Screen Time API'sine dayanıyor, yani kullanımı sıkı kurallara bağlı bir framework'e. Bu rehber inceleme kuralını ele alıyor. Build'i gönderirken aldığın hata için ITMS-90338 rehberini oku. Aynı bölümde yer alan arka plan modları için de guideline 2.5.4 rehberine bak.
Guideline 2.5.1 ne diyor?
Kural, App Review Guidelines içindeki 2.5 "Software Requirements" bölümünde: "Apps may only use public APIs and must run on the currently shipping OS. Keep your apps up-to-date and make sure you phase out any deprecated features, frameworks or technologies that will no longer be supported in future versions of an OS. Apps should use APIs and frameworks for their intended purposes and indicate that integration in their app description."
Kısacası dört zorunluluk var:
- Yalnızca public API, yani Apple'ın dokümante ettiği API'ler.
- Güncel iOS sürümünde çalışan bir uygulama, Eylül 2026'dan beri iOS 27.
- Kaldırılacak, kullanımdan düşmüş hiçbir şey olmamalı: Apple'ın ömrünün sonuna geldiğini duyurduğu şeyleri değiştirirsin.
- Her framework yerinde kullanılmalı ve açıklamada belirtilmeli: akıllı ev için HomeKit, sağlık ve spor için Sağlık uygulamasına bağlı HealthKit.
Ret mesajının başlığı da buradan geliyor: "Guideline 2.5.1 - Performance - Software Requirements".
Public API: Expo uygulamasında risk nerede saklanıyor?
Private API, Apple'ın dokümante etmediği bir sistem fonksiyonudur. Apple ne davranışını ne de bir sonraki iOS sürümünde var olacağını garanti eder, yasak da buradan geliyor.
JavaScript kodun iOS'a hiçbir zaman doğrudan dokunmaz: native modüllerden geçer. Expo SDK'nın modüllerini Expo ekibi geliştirir. Diğerleri senin yazmadığın kod içerir ve Apple bu kodu seninkiyle aynı şekilde inceler. ITMS-90683 rehberi aynı mekanizmayı izin cümleleriyle gösteriyor: Apple uygulamanın ne yaptığına değil, build'de bulunan koda bakar.
Solys'te 15 Ekim 2026 itibarıyla 42 doğrudan bağımlılık native iOS kodu içeriyor, bunların 14'ü Expo SDK dışında. Aralarında RevenueCat, Sentry, AppsFlyer ve Screen Time API'ye köprü olan react-native-device-activity var.
Private API iki anda yakalanabilir. Gönderim sırasında App Store Connect'in otomatik analizi ITMS-90338 hatasını döndürebilir. İnceleme sırasında ise reviewer 2.5.1'i gösterir.
Kullanımdan kaldırılan API'ler: UIWebView'dan UIScene'e
En bilinen örnek, web içeriği göstermeye yarayan eski bileşen UIWebView. Apple onu Nisan 2020'de yeni uygulamalarda, ardından Aralık 2020'de güncellemelerde kabul etmeyi bıraktı. Hâlâ ona referans veren eski bir kütüphane gönderimi engelliyordu. Solys'te aşağıdaki kontrol listesindeki arama hiçbir referans bulmuyor.
Bir sonraki değişiklik şimdiden duyuruldu. Apple'ın TN3187 teknik notu bunu açıkça yazıyor: "In the next major release following iOS 26, UIScene lifecycle will be required when building with the latest SDK; otherwise, your app won't launch." Yani iOS 27 SDK'sı ile scene tabanlı yaşam döngüsü olmadan derlenen bir uygulama açılmaz.
Birbirine bağlanması gereken üç tarih:
- Nisan 2026'dan beri Apple Xcode 26 istiyor: bu, ITMS-90725 rehberinin konusu.
- Nisan 2027'de, Apple'ın gönderim sayfasına göre iOS 27 SDK'sı zorunlu olacak.
- Expo SDK 58, 15 Eylül 2026'dan beri betada ve Expo'nun duyurusuna göre scene yönetimini şimdiden üretiyor.
Expo SDK 57 ve Xcode 26 ile hâlâ iOS 26 SDK'sıyla derliyorsun: bugün hiçbir şey bozulmuyor. AppDelegate'i değiştiren modüllerin Nisan 2027'den önce buna uyum sağlaması gerekecek.
Amacı dışında kullanılan framework'ler
Reviewer, hassas bir framework'ün görünür bir işleve hizmet ettiğini ve mağaza sayfanın bundan bahsettiğini kontrol eder.
- HealthKit sağlık ve spor içindir. Apple'ın arayüz önerileri bunu söylüyor: "If your app doesn't provide health and fitness functionality, don't request access to people's private health data."
- HomeKit akıllı ev içindir, başka hiçbir şey için değil.
- PushKit VoIP aramaları içindir. PushKit dokümantasyonu net: "If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications." Arama olmadan uygulamayı uyandıran bir VoIP bildirimi kötüye kullanımdır.
- Family Controls, yani Screen Time API, özel bir izin gerektirir. Dokümantasyonu şöyle diyor: "Before submitting your app to the App Store, you must request permission to use the entitlement."
Solys için bu dağıtım iznini 23 Eylül 2026'da istedim, Apple da aynı gün verdi. Kullanım framework'le örtüşüyor: kullanıcı duraklatılacak uygulamaları seçiyor, Solys de bunları uyandıktan sonra 30, 45 ya da 60 dakika engelliyor. Mağaza sayfasındaki açıklama bunu tek cümleyle söylüyor: "Solys, seçilen uygulamaları duraklatmak için Apple'ın Screen Time iznini kullanır." 2.5.1'in son kısmının istediği tam olarak bu: entegrasyonu açıklamada belirtmek.
Beta sürümler: TestFlight evet, App Store hayır
App Store Connect sürüm notları kuralı pratikte gösteriyor. 14 Ekim 2026'da Xcode 27.2 beta 3 ile yapılan build'ler "for internal and external testing", yani TestFlight için kabul ediliyor. 5 Ekim'de ise Xcode 27.1 RC build'leri "for the App Store" kabul ediliyor.
Xcode betasıyla derlenen bir build TestFlight'a gider, asla incelemeye gitmez. Göndermek için final bir sürüme ya da Apple'ın App Store'a açtığı bir RC'ye ihtiyacın var.
Expo uygulaması için iki not:
- Expo betası, Apple betası değildir. Apple, Expo'nun sürümünü değil, Xcode ve iOS SDK sürümünü kontrol eder. SDK 58 duyurusu, Xcode 27'li EAS imajlarının yakında geleceğini de ekliyordu.
- iOS 26 SDK'sıyla derlesen bile güncel iOS'ta test etmek zorunlu. Uygulamayı güncel bir iPhone'da ya da simülatörde sıfırdan başlat.
Kontrol listesi: gönderimden önce native bağımlılıklar
Her production build'den önce bunu geç. Komutlar Expo projesinin kök dizininde çalıştırılır:
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
npx expo-doctorhiçbir başarısızlık bildirmiyor. Solys'te 15 Ekim 2026'da: 21 kontrolden 20'si başarılı. Başarısızlık, bir yama sürümü geride kalan 13 Expo paketinden geliyordu,npx expo install --checkbunları hizalıyor.- Expo SDK dışındaki her modül React Native Directory'de yer alıyor. Expo dokümantasyonunun belirttiği gibi Expo Doctor bu kontrolü varsayılan olarak yapıyor. Bilinmeyen bir paketin iOS kodunu okumaya değer.
- Her native modül React Native sürümünü takip ediyor. Expo sürüm tablosu SDK 57'yi React Native 0.86 ile eşleştiriyor. Birkaç sürümdür yayın yapmamış bir modül bir uyarı işaretidir.
- UIWebView araması hiçbir sonuç döndürmüyor. Apple'ın ömrünün sonuna geldiğini duyurduğu her API için aynısını yap.
- Her hassas framework'ün görünür bir işlevi var: sağlık, Screen Time, aramalar, ev. Açıklama bundan bahsediyor ve özel izin verilmiş durumda.
- Build final bir Xcode'dan çıkıyor. Sürümü EAS build loglarında kontrol et.
- Uygulama güncel iOS sürümünde, yeni bir hesapla sıfırdan açılıyor.
- AppDelegate'e dokunan modüller UIScene desteğini duyuruyor, sen iOS 27 SDK'sına geçmeden önce.
2.5.1 reddine nasıl yanıt verilir?
Mesaj genelde sorunlu API'yi ya da framework'ü adıyla belirtir. İki durum var:
- Framework görünür hiçbir işe yaramıyor: modülü ya da capability'yi kaldır, yeni bir build al, sonra iki cümleyle yanıt ver.
- Framework gerçek bir işleve hizmet ediyor: tam yolu, bir ekran görüntüsünü ya da kısa bir videoyu ver ve mağaza sayfasının açıklamasında entegrasyonu belirt.
Native bir modülü kaldırmak binary'yi değiştirir: uzaktan güncelleme yetmez. Guideline 2.1 rehberi, reviewer'ın neden yalnızca build'e gömülü kodu gördüğünü açıklıyor. Sonrasında yazışma App Store Connect'te sürer, tıpkı App Review'a yanıt verme rehberindeki gibi.
Göndermeden önce projeni kontrol et
Review Kit, gönderim öncesi kontrol listemi, düzelttiğim retleri ve Expo projeni gözden geçiren Claude Code skill'lerini bir araya getiriyor. Bir insan gözü istersen benimle bir saatlik görüşme ayarla: Apple'ın mesajını ve bağımlılıklarını birlikte okuyalım. Tüm süreç Apple tarafından reddedilen uygulama sayfasında.
İlk yayınına mı hazırlanıyorsun? Ücretsiz diagnostiğini yap: sana Apple retlerine karşı kontrol listemi gönderiyor.
Sık sorulan sorular
"Guideline 2.5.1 - Performance - Software Requirements" ne anlama geliyor?
Apple uygulamanın public olmayan bir API, kullanımdan kaldırılmış bir teknoloji ya da amacı dışında bir framework kullandığını düşündüğünde gelen ret başlığı bu. Mesaj genelde sorunlu öğeyi adıyla belirtir.
Guideline 2.5.1 ile ITMS-90338 hatası arasındaki fark ne?
ITMS-90338, analiz public olmayan bir sembol yakaladığında build gönderilirken alınan otomatik bir hata. 2.5.1 ise bir insanın uyguladığı inceleme kuralı ve amacı dışında kullanılan framework'leri ve kullanımdan kaldırılmış teknolojileri de kapsıyor.
Xcode betasıyla derlenmiş bir uygulama gönderilebilir mi?
Hayır. App Store Connect bu build'leri yalnızca TestFlight için kabul ediyor. İnceleme için final bir Xcode sürümüyle ya da Apple'ın sürüm notlarında App Store'a açtığı bir RC ile derle.
Bir Expo uygulaması farkında olmadan private API kullanabilir mi?
Evet, üçüncü taraf bir native modül aracılığıyla. JavaScript kodun iOS'u kendisi çağırmaz ama her native paket Objective-C ya da Swift kodu içerir. Her sürümden önce Expo SDK dışındaki modüllerin listesini gözden geçir.
Hemen Expo SDK 58'e geçmek gerekiyor mu?
15 Ekim 2026 itibarıyla 2.5.1 için gerekmiyor: SDK 57, hâlâ kabul edilen iOS 26 SDK'sıyla derliyor. Apple'ın iOS 27 SDK'sını ve scene tabanlı yaşam döngüsünü zorunlu tutacağı Nisan 2027'den önce geçişi planla.

