Guideline 2.5.4 reddi: Apple arka plan modunu kabul etmiyor
Yazan: Mehdi Azizi
tarihinde yayınlandı, 9 dk.
Guideline 2.5.4: Apple, kullanan bir özelliği olmayan arka plan modunu reddeder. Anahtarı kaldır ya da reviewer'a sesi, konumu veya aramayı göster.
Guideline 2.5.4, arka plan modlarını amaçlanan kullanımlarıyla sınırlar: ses, konum, VoIP aramaları, görevin tamamlanması, yerel bildirimler. Info.plist dosyan bu modlardan birini bildirdiğinde ve reviewer buna ihtiyaç duyan hiçbir özellik bulamadığında ret gelir. Hiçbir şey kullanmıyorsa anahtarı kaldır, kullanıyorsa özelliği reviewer'a otuz saniyede göster.
Kendi iOS uygulamalarımı Expo ile yayınlıyorum. Mini oyunlu çalar saatim Solys, audio modunu bildiriyor: önce kaldırdım, sonra başka bir sebeple geri ekledim. Bu rehber Apple'ın metnine, başka geliştiricilerin paylaştığı retlere ve kendi projelerime dayanıyor. Ret sebeplerinin genel tablosu için Apple bir uygulamayı neden reddeder yazısını oku.
Guideline 2.5.4 ne diyor?
Kural tek bir cümle; App Review Guidelines içinde, 2. bölüm "Performance", 2.5 "Software Requirements" kısmında: "Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc."
Kısacası: bir arka plan servisi yalnızca var olma amacı için kullanılır. "Guideline 2.5.4 - Performance - Software Requirements" başlığı da buradan geliyor.
Varsayılan olarak arka plana geçen bir uygulama askıya alınır. Çalışmaya devam etmek için Info.plist dosyasındaki UIBackgroundModes anahtarında bir veya birkaç mod bildirir. Apple'ın arka plan modları dokümantasyonu, pil yüzünden bunları idareli kullanmanı ve başka bir çözüm varsa onu tercih etmeni istiyor. Bildirdiğin her mod, reviewer'ın kontrol edebileceği bir sözdür.
Arka plan modları ve amaçlanan kullanımları
| Mod | Anahtar | Amaçlanan kullanım |
|---|---|---|
| Ses, AirPlay, PiP | audio | Arka planda duyulan ses |
| Konum | location | Sürekli konum |
| IP üzerinden ses | voip | CallKit ile aramalar |
| Arka planda getirme | fetch | Düzenli ağ içeriği |
| İşleme | processing | Planlanmış görevler |
| Uzak bildirimler | remote-notification | Yeni içerik push'u |
Bu tablo Apple'ın sayfasını özetliyor. Forumlarda paylaşılan retlerde en çok audio, location ve voip karşımıza çıkıyor.
2.5.4 ret mesajı ne anlama geliyor?
Mesaj, sorunlu modun adını verir. Geliştiricilerin Apple forumlarında paylaştığı iki örnek:
- Audio: "Your app still declares support for audio in the UIBackgroundModes key in your Info.plist but did not include features that require persistent audio." Devamında
audioanahtarının, müzik çalar gibi arka planda içerik dinleten uygulamalar için olduğu belirtiliyor. İki çıkış yolu sunuyor: bu içeriği eklemek ya da anahtarı kaldırmak (forum başlığı). - Konum: Aralık 2024 tarihli bir başlıkta Apple, çalışan takibi dışında kalıcı konum gerektiren hiçbir özellik bulamamış ve tek başına bu kullanımın uygun olmadığını yazmış.
Benim yorumum: reviewer kodunu okumaz, bir özellik arar. Onu başlatabilmeli, uygulamayı arka plana alabilmeli ve çalışmaya devam ettiğini görebilmeli.
Tersi de oluyor. Mayıs 2026 tarihli bir başlıkta, audio modunu gerçekten kullanan sesli okuma uygulaması birkaç kez reddedilmiş: reviewer sesi tetikleyemiyormuş. Başka bir geliştirici orada, kendi görüşüne göre ekli bir videonun onun durumunu çözdüğünü yazıyor. Bu bir tanıklık, Apple'ın bir kuralı değil.
Anahtarı sen eklemediysen nereden geliyor?
Expo'da Info.plist dosyasını prebuild sırasında config plugin'leri doldurur. Yani bir arka plan modu, sen karar vermeden binary'ne girebilir.
Varsayılan ayarlarıyla expo-audio plugin'i
expo-audio dokümantasyonu bunu belirtiyor: enableBackgroundPlayback seçeneği varsayılan olarak true ve iOS'ta audio modunu ekliyor. Yani plugin'i kısa haliyle, "expo-audio" olarak bildirmek modu bildirmeye yetiyor.
TradaZen'i ilk gönderimden önce gözden geçirirken tam olarak bunu buldum: ön planda kısa arayüz sesleri, ama kısa haliyle bildirilmiş bir plugin. Düzeltme app.json içinde:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Başka paketler de kendi yöntemleriyle mod ekliyor. expo-location içindeki isIosBackgroundLocationEnabled seçeneği location modunu yalnızca etkinleştirirsen ekliyor. expo-background-task ise kurulduğu anda prebuild sırasında processing ekliyor.
Eski anahtarı tutan ios/ klasörü
İkinci tuzak, Temmuz 2026'da Solys'te yaşadım. audio modunu app.json dosyasından kaldırmıştım ama anahtar, daha önce oluşturulmuş ios/Solys/Info.plist içinde duruyordu. --clean olmadan yapılan bir prebuild bu projeyi yeniden oluşturmak yerine değiştirir ve plugin anahtarı ekler ama hiç kaldırmaz. Yerel bir build onu içine alırdı. Bulutta bir EAS build'i ise ios/ git tarafından yok sayılıyorsa temiz bir prebuild'den başlar, benim durumum da buydu.
Her build'den önce gerçekten ne gideceğini kontrol ediyorum:
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
İlki, prebuild'in Info.plist'e yazacağı modları listeler. İkincisi, ios/ klasörünü silerek native projeyi yerel bir build için yeniden oluşturur. Solys'te ilki "UIBackgroundModes":["audio"] gösteriyor, TradaZen'de hiçbir şey: ikisi de bilinçli.
Bir mod eklemek veya kaldırmak Info.plist dosyasını, dolayısıyla binary'yi değiştirir: yeni bir build gerekir, uzaktan güncelleme yetmez. EAS Update dokümantasyonu bu değişiklikleri yeni binary gerektirenler arasında sayıyor, tıpkı ITMS-90683 için olduğu gibi.
Solys: gerçek bir sebeple bildirilmiş audio modu
Solys bir çalar saat, ama audio modu alarmı çaldırmak için değil: alarm sesi AlarmKit üzerinden geçiyor, Apple'ın iOS 26'dan beri sunduğu alarm servisi (AlarmKit dokümantasyonu). Sessiz moddayken bile çalan sistem, uygulama değil.
Anahtarın geçmişi, çünkü mantık satırın kendisinden daha önemli:
- Temmuz 2026 sonunda kaldırıyorum. Arka planda hiçbir şey ses çalmıyordu: mini oyunların ses efektleri ön planda kalıyor ve alarm uygulamaya bağlı değil.
- İki gün sonra geri ekliyorum, gece dinleme özelliğiyle birlikte. Bu seçenek gecenin seslerini mikrofonla kaydediyor ve iPhone üzerinde analiz ediyor. Kayıt ekran kilitliyken devam etmeli ve expo-audio dokümantasyonu, arka planda kayıt seçeneğinin de
audiomodunu eklediğini belirtiyor.
Gerekçenin doğası değişti: mod çalmak için değil, kaydetmek için kullanılıyor. Uygulamada görünen üç güvence:
- dinleme varsayılan olarak kapalı bir seçenek, ayarlardan ya da akşam rutininden açılıyor;
- her kayıt için kural 2.5.14 gerektirdiği gibi kendi onay ekranı var ve hiçbir şey telefondan çıkmıyor;
- mikrofon alarmdan on dakika önce kapanıyor, böylece dinleme ve alarm sesi asla birbirini engellemiyor.
Bir reviewer'ın bu bildirimi her zaman kabul edeceğini garanti edemem. Ama her öğenin ne işe yaradığını ve nerede görüleceğini söyleyebiliyorum.
Uygulamayı uyanık tutan çalar saatler
AlarmKit'ten önce üçüncü taraf bir çalar saat uygulaması Apple'ın alarmı gibi çalamıyordu. Bu yüzden bazı kütüphaneler uygulamayı uyanık tutuyordu: Flutter paketi alarm2 dokümantasyonu, alarma kadar çalışan sessiz bir ses oynatıcı anlatıyor. Oysa sessiz bir ses hiçbir şey duyurmaz. iOS 26'dan beri AlarmKit bu dolambaçlı yolu gereksiz kılıyor.
Modu tutmak mı kaldırmak mı: karar tablosu
| Durumun | Ne yapmalı |
|---|---|
| Ön planda kısa sesler | audio kaldır |
| Müzik veya sesli kitap | Tut, göster |
| Uzun kayıt | Tut + onay |
| Çalar saat veya zamanlayıcı | AlarmKit (iOS 26) |
| Arada bir konum | Önemli konum değişiklikleri |
| Acil olmayan senkronizasyon | fetch veya processing |
| Sesli veya görüntülü aramalar | CallKit ile voip |
Konum için Apple'ın sayfası, location moduna alternatif olarak önemli konum değişiklikleri servisini öneriyor.
2.5'in diğer maddeleri: 2.5.1 ve 2.5.2
2.5.1: herkese açık API'ler ve yerinde kullanılan framework'ler
"Apps may only use public APIs and must run on the currently shipping OS." Uygulama yalnızca herkese açık API'leri kullanır, sistemin güncel sürümünde çalışır ve kullanımdan kaldırılmış olanları bırakır. 2.5.4'te olduğu gibi her framework, açıklamada belirtilen amaçlanan kullanımına hizmet eder: sağlık için HealthKit, akıllı ev için HomeKit. Bir kütüphane özel bir API çağırırsa reddi yiyen senin uygulamandır.
2.5.2: uygulamayı değiştiren indirilmiş kod yok
Uygulama kendi paketi içinde bağımsız kalır. "download, install, or execute code which introduces or changes features or functionality of the app" yapamaz. Yalnızca kodlamayı öğreten eğitim uygulamalarının, kodun tamamen görünür ve kullanıcı tarafından düzenlenebilir olması şartıyla sınırlı bir istisnası var.
Expo'da bu soru EAS Update'i ilgilendiriyor; dokümantasyonu güncellemelerin App Store kurallarına uyması gerektiğini hatırlatıyor. Uzaktan güncellemeleri düzeltme için kullan, reviewer'ın görmediği bir özelliği yayınlamak için asla. İncelemeyle ilgili bir düzeltme, guideline 2.1 rehberinde anlattığım gibi yeni bir build'den geçer.
2.5.4 reddine nasıl cevap verilir?
Yazışma, uygulamanın App Review bölümünde, App Review mesajına cevap verdiğin yerde geçer. İki durum var:
- Mod hiçbir işe yaramıyor: kaldır, yeniden build al, introspection'ı kontrol et, sonra iki cümleyle cevap ver.
- Mod gerçek bir özelliğe hizmet ediyor: tam yolu ve kısa bir videoyu içeren bir cevap ver, sonra bu metni her sürümün inceleme notlarına ekle.
Kullanacağım şablon, uyarlaman gerek (uygulamanda alarm yoksa alarmla ilgili cümleyi çıkar):
Hello,
The "audio" background mode is used only by [feature], an
optional feature that [records / plays] audio while the
device is locked. It is off by default.
How to test:
1. Open [screen] and turn on [feature].
2. Accept the microphone permission if asked.
3. Tap [button], then lock the device.
[What the reviewer will hear or see.]
Our alarm does not use this mode: it is scheduled with
AlarmKit and rings through the system.
Attached: a short screen recording of these steps.
Best regards,
Gönderimden önce 2.5.4 kontrol listesi
- Expo introspection yalnızca istediğin modları gösteriyor ve her birinin özelliğini söyleyebiliyorsun.
- expo-audio gibi varsayılan olarak mod ekleyen hiçbir plugin kısa haliyle bildirilmemiş.
- Yerel
ios/klasörün eski bir anahtar tutmuyor ya da temiz bir prebuild'den derliyorsun. - Özellik gizli bir ayar olmadan hızla tetikleniyor ve inceleme notları hangi modun neye yaradığını ve nasıl test edileceğini söylüyor.
- Her kayıt açık bir onay istiyor ve görünür bir gösterge gösteriyor. İzin istekleriyle ilgili kurallar guideline 5.1.1 rehberinde.
- Bir çalar saat için alarm sesi uygulamadan çalınan bir sesle değil, AlarmKit üzerinden geçiyor.
Göndermeden önce dosyanı kontrol et
Review Kit, gönderim öncesi kontrol listemi, tester için not şablonlarını ve projeni gözden geçiren Claude Code skill'lerini bir araya getiriyor. İnsan gözüyle bir bakış için benimle bir saat ayır: Apple'ın mesajını ve Info.plist dosyanı görüntülü görüşmede birlikte okuyoruz. Sürecin tamamı Apple tarafından reddedilen uygulama sayfasında.
İlk yayınını mı hazırlıyorsun? Ücretsiz teşhisini yap: adımları sıraya koyar ve sana Apple reddine karşı kontrol listemi gönderir.
Kimse Apple'ın uygulamanı kabul edeceğini garanti edemez. Ama iyi gerekçelendirilmiş bir arka plan modu otuz saniyede savunulur.
Sık sorulan sorular
"Guideline 2.5.4 - Performance - Software Requirements" ne demek?
Apple, Info.plist dosyandaki bir arka plan modunun amaçlanan kullanımına hizmet etmediğini düşündüğünde gelen reddin başlığıdır. Mesaj modun adını verir ve onu kullanan özelliği göstermeni ya da anahtarı kaldırmanı önerir.
2.5.4 reddinden sonra yeni bir build gerekir mi?
Bir modu kaldırır veya değiştirirsen evet: anahtar Info.plist'te, dolayısıyla binary'de. Mod gerekçeliyse tam yolu ve bir videoyu içeren bir cevap yetebilir.
Birkaç arayüz sesi için audio modu tutulabilir mi?
Hayır. Ön planda çalınan kısa seslerin buna ihtiyacı yok. Expo'da expo-audio plugin'inde enableBackgroundPlayback değerini false yap.
Bir çalar saat uygulamasının audio moduna ihtiyacı var mı?
iOS 26'dan beri sunulan AlarmKit'e dayanıyorsa çalmak için yok: alarmı sistem çalar. Solys'te audio modu, ekran kilitliyken kayıt yapan gece dinleme özelliği için kullanılıyor.
Hiçbir şey bildirmediğim halde Apple neden 2.5.4'ü gösteriyor?
Belki bir plugin bunu senin yerine yaptı: expo-audio varsayılan olarak audio modunu ekliyor ve eski bir ios/ klasörü yapılandırmandan kaldırılmış bir anahtarı tutabiliyor. npx expo config --type introspect ile kontrol et.

