Guideline 2.5.4: mode latar belakang ditolak Apple
Oleh Mehdi Azizi
Terbit , 9 mnt
Apple menolak mode latar belakang yang tidak dipakai fitur apa pun. Hapus kuncinya, atau tunjukkan fiturnya ke reviewer.
Guideline 2.5.4 membatasi mode latar belakang hanya untuk kegunaan aslinya: suara, lokasi, panggilan VoIP, menyelesaikan tugas, dan notifikasi lokal. Penolakan muncul kalau Info.plist kamu mendeklarasikan salah satu mode ini, tapi reviewer tidak menemukan fitur yang membutuhkannya. Kalau tidak ada yang memakainya, hapus kuncinya. Kalau ada, buat reviewer bisa melihat fiturnya dalam tiga puluh detik.
Saya merilis app iOS saya sendiri dengan Expo. Solys, alarm saya yang dilengkapi mini-game, mendeklarasikan mode audio: saya sempat menghapusnya, lalu memasangnya lagi karena alasan lain. Panduan ini berdasar pada teks Apple, penolakan yang dibagikan developer lain, dan proyek-proyek saya. Untuk gambaran umum alasan penolakan, baca kenapa Apple menolak sebuah app.
Apa isi guideline 2.5.4?
Aturannya cuma satu kalimat, di bagian 2 "Performance", subbagian 2.5 "Software Requirements" dari App Review Guidelines: "Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc."
Sederhananya: layanan latar belakang hanya boleh dipakai untuk tujuan aslinya. Karena itu judul penolakannya "Guideline 2.5.4 - Performance - Software Requirements".
Secara default, app yang masuk ke latar belakang akan ditangguhkan. Supaya tetap berjalan, app harus mendeklarasikan satu atau beberapa mode di kunci UIBackgroundModes pada Info.plist. Dokumentasi Apple tentang mode latar belakang meminta kita memakainya seperlunya saja karena boros baterai, dan memilih solusi lain kalau ada. Setiap mode yang kamu deklarasikan adalah janji yang bisa dicek reviewer.
Mode latar belakang dan kegunaan aslinya
| Mode | Kunci | Kegunaan asli |
|---|---|---|
| Audio, AirPlay, PiP | audio | Suara yang terdengar di latar |
| Lokasi | location | Lokasi terus-menerus |
| Voice over IP | voip | Panggilan dengan CallKit |
| Background fetch | fetch | Konten jaringan berkala |
| Pemrosesan | processing | Tugas terjadwal |
| Notifikasi jarak jauh | remote-notification | Push konten baru |
Tabel ini merangkum halaman Apple. Di penolakan yang dibagikan di forum, audio, location dan voip paling sering muncul.
Apa arti pesan penolakan 2.5.4?
Pesannya menyebut mode yang bermasalah. Dua contoh yang dibagikan developer di forum Apple:
- 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." Lanjutannya menjelaskan bahwa kunci
audioditujukan untuk app yang memutar konten yang terdengar di latar belakang, seperti pemutar musik. Ada dua jalan keluar yang ditawarkan: tambahkan konten itu atau hapus kuncinya (thread forum). - Lokasi: di thread Desember 2024, Apple tidak menemukan fitur lain selain pelacakan karyawan yang butuh lokasi permanen, dan menulis bahwa penggunaan itu saja tidak pantas.
Menurut saya: reviewer tidak membaca kode kamu, dia mencari fitur. Dia harus bisa menjalankannya, memindahkan app ke latar belakang, lalu melihat bahwa fitur itu tetap jalan.
Kasus sebaliknya juga ada. Di thread Mei 2026, sebuah app pembaca teks bersuara yang benar-benar memakai mode audio ditolak beberapa kali: reviewer tidak berhasil memunculkan suaranya. Developer lain di thread itu menulis bahwa menurutnya, video yang dilampirkan berhasil meloloskan kasusnya. Itu sekadar pengalaman, bukan aturan Apple.
Dari mana kunci itu datang kalau kamu tidak menambahkannya?
Di Expo, plugin konfigurasilah yang mengisi Info.plist saat prebuild. Jadi mode latar belakang bisa masuk ke binary kamu tanpa kamu sadari.
Plugin expo-audio dengan pengaturan default
Dokumentasi expo-audio menyebutkannya: opsi enableBackgroundPlayback bernilai true secara default dan, di iOS, menambahkan mode audio. Jadi cukup mendeklarasikan plugin dalam bentuk singkatnya, "expo-audio", untuk mendeklarasikan mode itu.
Itulah yang saya temukan waktu memeriksa ulang TradaZen sebelum pengiriman pertamanya: cuma suara antarmuka pendek di latar depan, tapi pluginnya dideklarasikan dalam bentuk singkat. Perbaikannya cukup di app.json:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Paket lain menambahkan mode dengan caranya sendiri. Opsi isIosBackgroundLocationEnabled dari expo-location hanya menambahkan location kalau kamu mengaktifkannya. Sementara expo-background-task menambahkan processing saat prebuild begitu paketnya terpasang.
Folder ios/ yang menyimpan kunci lama
Jebakan kedua, saya alami di Solys pada Juli 2026. Saya sudah menghapus audio dari app.json, tapi kuncinya masih ada di ios/Solys/Info.plist yang dibuat sebelumnya. Prebuild tanpa --clean mengubah proyek itu alih-alih membuatnya ulang, dan plugin hanya menambahkan kunci tanpa pernah menghapusnya. Build lokal pasti ikut membawanya. Build EAS di cloud mulai dari prebuild baru kalau ios/ diabaikan oleh git, dan itulah kondisi saya.
Sebelum setiap build, saya cek apa yang benar-benar akan dikirim:
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
Perintah pertama menampilkan mode yang akan ditulis prebuild ke Info.plist. Perintah kedua membuat ulang proyek native untuk build lokal, dengan menghapus folder ios/. Di Solys, perintah pertama menampilkan "UIBackgroundModes":["audio"], di TradaZen tidak ada apa-apa: keduanya memang disengaja.
Menambah atau menghapus mode mengubah Info.plist, artinya mengubah binary: kamu butuh build baru, update jarak jauh tidak cukup. Dokumentasi EAS Update memasukkan perubahan ini ke daftar yang butuh binary baru, sama seperti ITMS-90683.
Solys: mode audio yang dideklarasikan dengan alasan nyata
Solys adalah app alarm, tapi mode audio tidak dipakai untuk membunyikan alarm: bunyi alarm lewat AlarmKit, layanan alarm Apple yang tersedia sejak iOS 26 (dokumentasi AlarmKit). Yang membunyikannya sistem, bahkan dalam mode senyap, bukan app-nya.
Riwayat kunci ini, karena alasannya lebih penting daripada satu baris kode itu:
- Akhir Juli 2026, saya menghapusnya. Tidak ada yang memutar suara di latar belakang: efek suara mini-game hanya di latar depan, dan alarm tidak bergantung pada app.
- Dua hari kemudian, saya memasangnya lagi, bersamaan dengan fitur pemantauan tidur. Opsi ini merekam suara-suara selama kamu tidur lewat mikrofon dan menganalisisnya di iPhone. Perekaman harus tetap jalan saat layar terkunci, dan dokumentasi expo-audio menyebutkan bahwa opsi perekaman di latar belakang juga menambahkan mode
audio.
Alasannya berubah sifat: mode ini dipakai untuk merekam, bukan memutar. Ada tiga pengaman yang terlihat di app:
- pemantauan ini opsi yang mati secara default, dan diaktifkan dari pengaturan atau dari rutinitas malam;
- ada layar persetujuan tersendiri, sesuai aturan 2.5.14 untuk semua perekaman, dan tidak ada data yang keluar dari ponsel;
- mikrofon ditutup sepuluh menit sebelum alarm, supaya pemantauan dan bunyi alarm tidak pernah saling mengganggu.
Saya tidak bisa menjamin reviewer akan selalu menerima deklarasi ini. Yang saya bisa: menjelaskan tiap elemen, untuk apa dan di mana melihatnya.
App alarm yang membuat app tetap aktif
Sebelum AlarmKit, app alarm pihak ketiga tidak bisa berbunyi seperti alarm Apple. Jadi beberapa library membuat app tetap aktif: dokumentasi paket Flutter alarm2 menjelaskan pemutar audio senyap yang terus berjalan sampai alarm berbunyi. Padahal suara senyap tidak terdengar apa-apa. Sejak iOS 26, AlarmKit membuat cara memutar ini tidak perlu lagi.
Pertahankan atau hapus mode: tabel keputusan
| Situasi kamu | Yang harus dilakukan |
|---|---|
| Suara pendek di latar depan | Hapus audio |
| Musik atau buku audio | Pertahankan, tunjukkan |
| Perekaman panjang | Pertahankan + persetujuan |
| Alarm atau timer | AlarmKit (iOS 26) |
| Lokasi sesekali | Perubahan signifikan |
| Sinkronisasi tidak mendesak | fetch atau processing |
| Panggilan audio atau video | voip dengan CallKit |
Untuk lokasi, halaman Apple menyebut layanan perubahan lokasi signifikan sebagai alternatif mode location.
Poin lain di 2.5: 2.5.1 dan 2.5.2
2.5.1: API publik dan framework sesuai tempatnya
"Apps may only use public APIs and must run on the currently shipping OS." App hanya boleh memakai API publik, berjalan di versi sistem terbaru, dan meninggalkan yang sudah deprecated. Sama seperti 2.5.4, setiap framework dipakai untuk kegunaan aslinya dan disebut di deskripsi: HealthKit untuk kesehatan, HomeKit untuk rumah pintar. Kalau sebuah library memanggil API privat, app kamulah yang ditolak.
2.5.2: tidak ada kode unduhan yang mengubah app
App harus mandiri dalam paketnya. App tidak boleh "download, install, or execute code which introduces or changes features or functionality of the app". Hanya app edukasi yang mengajarkan coding yang punya pengecualian terbatas, dengan kode yang sepenuhnya terlihat dan bisa diubah pengguna.
Di Expo, ini menyangkut EAS Update, yang dokumentasinya mengingatkan bahwa update harus mematuhi aturan App Store. Pakai update jarak jauh untuk perbaikan, jangan pernah untuk mengirim fitur yang belum dilihat reviewer. Perbaikan terkait review harus lewat build baru, seperti yang saya jelaskan di panduan guideline 2.1.
Bagaimana membalas penolakan 2.5.4?
Percakapannya ada di bagian App Review app kamu, tempat kamu membalas pesan App Review. Ada dua kasus:
- Mode itu tidak dipakai: hapus, buat build baru, cek introspeksinya, lalu balas dalam dua kalimat.
- Mode itu dipakai fitur nyata: balas dengan langkah-langkah persisnya dan video singkat, lalu salin teks itu ke catatan review setiap versi.
Template yang akan saya pakai, sesuaikan dulu (hapus kalimat soal alarm kalau app kamu tidak punya alarm):
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,
Checklist 2.5.4 sebelum submit
- Introspeksi Expo hanya menampilkan mode yang memang kamu inginkan, dan kamu bisa menyebut fitur untuk masing-masing.
- Tidak ada plugin yang dideklarasikan dalam bentuk singkat kalau plugin itu menambahkan mode secara default, seperti expo-audio.
- Folder
ios/lokal kamu tidak menyimpan kunci lama, atau kamu build dari prebuild yang bersih. - Fiturnya bisa dijalankan dengan cepat, tanpa pengaturan tersembunyi, dan catatan review menjelaskan mode mana untuk apa dan cara mengujinya.
- Setiap perekaman meminta persetujuan eksplisit dan menampilkan indikator yang terlihat. Aturan soal permintaan izin ada di panduan guideline 5.1.1.
- Untuk app alarm, bunyi alarm lewat AlarmKit, bukan suara yang diputar dari app.
Cek berkasmu sebelum dikirim
Review Kit berisi checklist saya sebelum pengiriman, template catatan untuk tester, dan skill Claude Code yang memeriksa ulang proyek kamu. Kalau butuh mata manusia, pesan satu jam dengan saya: kita baca pesan Apple dan Info.plist kamu bersama lewat video call. Langkah lengkapnya ada di halaman app ditolak Apple.
Sedang menyiapkan rilis pertama? Ikuti diagnostik gratis: urutan langkahnya akan dirapikan dan kamu akan dikirimi checklist anti-penolakan Apple dari saya.
Tidak ada yang bisa menjamin Apple akan menerima app kamu. Tapi mode latar belakang yang alasannya jelas bisa dibela dalam tiga puluh detik.
Pertanyaan umum
Apa arti "Guideline 2.5.4 - Performance - Software Requirements"?
Itu judul penolakan saat Apple menilai ada mode latar belakang di Info.plist kamu yang tidak dipakai sesuai kegunaan aslinya. Pesannya menyebut mode tersebut dan menyarankan kamu menunjukkan fitur yang memakainya atau menghapus kuncinya.
Apakah perlu build baru setelah penolakan 2.5.4?
Kalau kamu menghapus atau mengubah mode, ya: kuncinya ada di Info.plist, berarti di dalam binary. Kalau modenya memang beralasan, balasan berisi langkah persis dan video bisa jadi sudah cukup.
Bolehkah mempertahankan mode audio untuk beberapa suara antarmuka?
Tidak. Suara pendek yang diputar di latar depan tidak membutuhkannya. Di Expo, atur enableBackgroundPlayback ke false di plugin expo-audio.
Apakah app alarm butuh mode audio?
Tidak untuk berbunyi, kalau app itu memakai AlarmKit yang tersedia sejak iOS 26: sistemlah yang membunyikan alarm. Di Solys, mode audio dipakai untuk pemantauan tidur, yang merekam saat layar terkunci.
Kenapa Apple menyebut 2.5.4 padahal saya tidak mendeklarasikan apa-apa?
Mungkin ada plugin yang melakukannya untukmu: expo-audio menambahkan mode audio secara default, dan folder ios/ lama bisa menyimpan kunci yang sudah kamu hapus dari konfigurasi. Cek dengan npx expo config --type introspect.

