Guideline 2.5.4: mod latar belakang ditolak Apple
Oleh Mehdi Azizi
Diterbitkan pada , 9 min
Apple menolak mod latar belakang yang tiada fungsi menggunakannya. Buang kunci itu atau tunjukkan fungsinya kepada reviewer.
Guideline 2.5.4 mengehadkan mod latar belakang kepada kegunaan asalnya: bunyi, lokasi, panggilan VoIP, penyelesaian tugas dan notifikasi tempatan. Penolakan berlaku apabila Info.plist anda mengisytiharkan salah satu mod ini, tetapi reviewer tidak menemui sebarang fungsi yang memerlukannya. Buang kunci itu jika tiada apa yang menggunakannya. Jika ada, tunjukkan fungsinya kepada reviewer dalam tiga puluh saat.
Saya menerbitkan app iOS saya sendiri dengan Expo. Solys, jam loceng saya yang ada permainan mini, mengisytiharkan mod audio: saya pernah membuangnya, kemudian memasukkannya semula atas sebab lain. Panduan ini berasaskan teks Apple, penolakan yang dikongsi oleh pembangun lain dan projek saya sendiri. Untuk gambaran keseluruhan sebab penolakan, baca kenapa Apple menolak app.
Apa kata guideline 2.5.4?
Peraturan ini hanya satu ayat, dalam seksyen 2 "Performance", bahagian 2.5 "Software Requirements", dalam App Review Guidelines: "Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc."
Ringkasnya: perkhidmatan latar belakang hanya untuk tujuan ia diwujudkan. Sebab itulah tajuknya "Guideline 2.5.4 - Performance - Software Requirements".
Secara lalai, app yang masuk ke latar belakang akan digantung. Untuk terus berjalan, ia mengisytiharkan satu atau beberapa mod dalam kunci UIBackgroundModes dalam Info.plist. Dokumentasi Apple tentang mod latar belakang meminta anda menggunakannya dengan berhemat kerana bateri, dan memilih penyelesaian lain jika ada. Setiap mod yang diisytiharkan ialah janji yang boleh disemak oleh reviewer.
Mod latar belakang dan kegunaan asalnya
| Mod | Kunci | Kegunaan asal |
|---|---|---|
| Audio, AirPlay, PiP | audio | Bunyi boleh didengar di latar |
| Lokasi | location | Lokasi berterusan |
| Voice over IP | voip | Panggilan dengan CallKit |
| Background fetch | fetch | Kandungan rangkaian berkala |
| Background processing | processing | Tugas berjadual |
| Remote notifications | remote-notification | Push kandungan baharu |
Jadual ini meringkaskan halaman Apple. Dalam penolakan yang dikongsi di forum, audio, location dan voip paling kerap muncul.
Apa maksud mesej penolakan 2.5.4?
Mesej itu menamakan mod yang bermasalah. Dua contoh yang dikongsi oleh pembangun 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." Seterusnya ia menjelaskan bahawa kunci
audioadalah untuk app yang memainkan kandungan boleh didengar di latar belakang, seperti pemain muzik. Ia memberi dua jalan keluar: tambah kandungan itu atau buang kunci tersebut (bebenang forum). - Lokasi: dalam bebenang Disember 2024, Apple tidak menemui fungsi lain selain penjejakan pekerja yang memerlukan lokasi berterusan, dan menulis bahawa kegunaan itu sahaja tidak sesuai.
Pandangan saya: reviewer tidak membaca kod anda, dia mencari fungsi. Dia perlu dapat memulakannya, menghantar app ke latar belakang dan melihat ia terus berjalan.
Kes sebaliknya juga wujud. Dalam bebenang Mei 2026, sebuah app bacaan suara yang benar-benar menggunakan mod audio ditolak beberapa kali: reviewer tidak berjaya mencetuskan bunyinya. Seorang pembangun lain menulis di situ bahawa, pada pendapatnya, video yang dilampirkan telah menyelesaikan kesnya. Itu testimoni, bukan peraturan Apple.
Dari mana datangnya kunci itu jika anda tidak menambahnya?
Dengan Expo, plugin konfigurasi yang mengisi Info.plist semasa prebuild. Jadi mod latar belakang boleh masuk ke dalam binari anda tanpa anda memutuskannya.
Plugin expo-audio dengan tetapan lalai
Dokumentasi expo-audio menyatakannya: pilihan enableBackgroundPlayback bernilai true secara lalai dan, pada iOS, menambah mod audio. Mengisytiharkan plugin dalam bentuk pendeknya, "expo-audio", sudah cukup untuk mengisytiharkan mod itu.
Inilah yang saya temui ketika menyemak semula TradaZen sebelum penghantaran pertamanya: bunyi antara muka yang pendek di latar depan, tetapi plugin diisytiharkan dalam bentuk pendek. Pembetulannya hanya dalam app.json:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Pakej lain menambah mod dengan cara masing-masing. Pilihan isIosBackgroundLocationEnabled dalam expo-location hanya menambah location jika anda mengaktifkannya. expo-background-task pula menambah processing semasa prebuild sebaik sahaja ia dipasang.
Folder ios/ yang menyimpan kunci lama
Perangkap kedua, saya alami sendiri pada Solys pada Julai 2026. Saya telah membuang audio daripada app.json, tetapi kunci itu masih ada dalam ios/Solys/Info.plist yang dijana lebih awal. Prebuild tanpa --clean mengubah projek ini dan bukannya menciptanya semula, dan plugin menambah kunci tanpa pernah membuangnya. Build tempatan akan membawanya sekali. Build EAS di awan bermula daripada prebuild baharu apabila ios/ diabaikan oleh git, dan itulah kes saya.
Sebelum setiap build, saya semak apa yang benar-benar akan dihantar:
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
Arahan pertama menyenaraikan mod yang akan ditulis oleh prebuild ke dalam Info.plist. Arahan kedua mencipta semula projek natif untuk build tempatan, dengan memadam folder ios/. Pada Solys, arahan pertama memaparkan "UIBackgroundModes":["audio"], pada TradaZen tiada apa-apa: kedua-duanya memang disengajakan.
Menambah atau membuang mod mengubah Info.plist, jadi mengubah binari: anda perlukan build baharu, kemas kini jarak jauh tidak mencukupi. Dokumentasi EAS Update meletakkan perubahan ini antara yang memerlukan binari baharu, sama seperti ITMS-90683.
Solys: mod audio diisytiharkan, dengan sebab yang sebenar
Solys ialah jam loceng, tetapi mod audio bukan untuk membunyikan penggera: deringan melalui AlarmKit, perkhidmatan penggera Apple yang tersedia sejak iOS 26 (dokumentasi AlarmKit). Sistem yang berbunyi, walaupun dalam mod senyap, bukan app.
Sejarah kunci ini, kerana penaakulannya lebih penting daripada barisnya:
- Hujung Julai 2026, saya membuangnya. Tiada apa yang memainkan bunyi di latar belakang: kesan bunyi permainan mini kekal di latar depan, dan penggera tidak bergantung pada app.
- Dua hari kemudian, saya memasukkannya semula, bersama ciri pemantauan malam. Pilihan ini merakam bunyi malam anda dengan mikrofon dan menganalisisnya pada iPhone. Rakaman perlu berterusan ketika skrin dikunci, dan dokumentasi expo-audio menyatakan bahawa pilihan rakaman di latar belakang juga menambah mod
audio.
Sifat justifikasinya telah berubah: mod ini untuk merakam, bukan memainkan. Tiga langkah perlindungan, kelihatan dalam app:
- pemantauan ialah pilihan yang dimatikan secara lalai, diaktifkan daripada tetapan atau rutin waktu malam;
- ia ada skrin persetujuannya sendiri, seperti yang diwajibkan oleh peraturan 2.5.14 untuk sebarang rakaman, dan tiada apa yang keluar dari telefon;
- mikrofon ditutup sepuluh minit sebelum penggera, supaya pemantauan dan deringan tidak pernah bertembung.
Saya tidak boleh menjamin reviewer akan sentiasa menerima pengisytiharan ini. Tetapi saya boleh terangkan, bagi setiap elemen, apa kegunaannya dan di mana untuk melihatnya.
Jam loceng yang memastikan app sentiasa berjaga
Sebelum AlarmKit, app jam loceng pihak ketiga tidak boleh berbunyi seperti penggera Apple. Jadi sesetengah pustaka memastikan app sentiasa berjaga: dokumentasi pakej Flutter alarm2 menerangkan pemain audio senyap yang berjalan sehingga penggera. Masalahnya, bunyi senyap tidak memperdengarkan apa-apa. Sejak iOS 26, AlarmKit menjadikan helah ini tidak perlu.
Simpan atau buang mod: grid keputusan
| Situasi anda | Apa perlu dibuat |
|---|---|
| Bunyi pendek di latar depan | Buang audio |
| Muzik atau buku audio | Simpan, tunjukkan |
| Rakaman panjang | Simpan + persetujuan |
| Jam loceng atau pemasa | AlarmKit (iOS 26) |
| Lokasi sekali-sekala | Perubahan lokasi ketara |
| Penyegerakan tidak mendesak | fetch atau processing |
| Panggilan audio atau video | voip dengan CallKit |
Untuk lokasi, halaman Apple menyebut perkhidmatan perubahan lokasi ketara (significant-change) sebagai alternatif kepada mod location.
Perenggan lain dalam 2.5: 2.5.1 dan 2.5.2
2.5.1: API awam dan framework mengikut kegunaannya
"Apps may only use public APIs and must run on the currently shipping OS." App hanya menggunakan API awam, berjalan pada versi semasa sistem dan meninggalkan apa yang sudah lapuk. Sama seperti 2.5.4, setiap framework digunakan untuk kegunaan asalnya, dan dinyatakan dalam penerangan: HealthKit untuk kesihatan, HomeKit untuk rumah pintar. Jika sesuatu pustaka memanggil API peribadi, app anda yang menanggung penolakan.
2.5.2: tiada kod dimuat turun yang mengubah app
App mesti kekal lengkap dalam pakejnya. Ia tidak boleh "download, install, or execute code which introduces or changes features or functionality of the app". Hanya app pendidikan yang mengajar pengaturcaraan mendapat pengecualian terhad, dengan kod yang boleh dilihat dan diubah sepenuhnya oleh pengguna.
Dengan Expo, soalan ini menyentuh EAS Update, yang dokumentasinya mengingatkan bahawa kemas kini mesti mematuhi peraturan App Store. Gunakan kemas kini jarak jauh untuk membetulkan, jangan sesekali untuk menghantar fungsi yang belum dilihat reviewer. Pembetulan berkaitan semakan perlu melalui build baharu, seperti yang saya terangkan dalam panduan guideline 2.1.
Bagaimana untuk membalas penolakan 2.5.4?
Perbualan berlaku dalam bahagian App Review app anda, tempat anda membalas mesej App Review. Dua kes:
- Mod itu tidak digunakan: buang, buat build semula, semak introspeksi, kemudian balas dalam dua ayat.
- Mod itu digunakan oleh fungsi sebenar: balas dengan laluan tepat dan video pendek, kemudian ulang teks ini dalam nota semakan setiap versi.
Templat yang saya akan gunakan, untuk disesuaikan (buang ayat tentang penggera jika app anda tiada penggera):
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,
Senarai semak 2.5.4 sebelum penghantaran
- Introspeksi Expo hanya memaparkan mod yang dikehendaki, dan anda boleh menamakan fungsi bagi setiap satu.
- Tiada plugin diisytiharkan dalam bentuk pendek jika ia menambah mod secara lalai, seperti expo-audio.
- Folder
ios/tempatan anda tidak menyimpan kunci lama, atau anda membina daripada prebuild yang bersih. - Fungsi itu cepat dicetuskan, tanpa tetapan tersembunyi, dan nota semakan menyatakan mod mana untuk apa dan cara mengujinya.
- Setiap rakaman meminta persetujuan yang jelas dan memaparkan penunjuk yang kelihatan. Peraturan tentang permintaan kebenaran ada dalam panduan guideline 5.1.1.
- Untuk jam loceng, deringan melalui AlarmKit, bukan bunyi yang dimainkan oleh app.
Semak fail anda sebelum dihantar
Review Kit menghimpunkan senarai semak saya sebelum penghantaran, templat nota untuk penguji dan skill Claude Code yang menyemak projek anda. Untuk pandangan manusia, tempah satu jam bersama saya: kita baca mesej Apple dan Info.plist anda bersama-sama, melalui panggilan video. Langkah lengkapnya ada di halaman app ditolak oleh Apple.
Sedang menyediakan pelancaran pertama anda? Buat diagnostik percuma anda: ia menyusun langkah mengikut urutan dan menghantar senarai semak anti-penolakan Apple saya kepada anda.
Tiada sesiapa boleh menjamin Apple akan menerima app anda. Tetapi mod latar belakang yang dijustifikasikan dengan baik boleh dipertahankan dalam tiga puluh saat.
Soalan lazim
Apa maksud "Guideline 2.5.4 - Performance - Software Requirements"?
Itu tajuk penolakan apabila Apple menganggap mod latar belakang dalam Info.plist anda tidak digunakan untuk kegunaan asalnya. Mesej itu menamakan mod tersebut dan mencadangkan anda menunjukkan fungsi yang menggunakannya atau membuang kunci itu.
Perlukah build baharu selepas penolakan 2.5.4?
Jika anda membuang atau mengubah mod, ya: kunci itu ada dalam Info.plist, jadi dalam binari. Jika mod itu wajar, balasan dengan laluan tepat dan video mungkin sudah memadai.
Bolehkah mod audio disimpan untuk beberapa bunyi antara muka?
Tidak. Bunyi pendek yang dimainkan di latar depan tidak memerlukannya. Dengan Expo, tetapkan enableBackgroundPlayback kepada false dalam plugin expo-audio.
Adakah app jam loceng memerlukan mod audio?
Bukan untuk berbunyi, jika ia bergantung pada AlarmKit, yang tersedia sejak iOS 26: sistem yang memainkan penggera. Pada Solys, mod audio digunakan untuk pemantauan malam, yang merakam ketika skrin dikunci.
Kenapa Apple menyebut 2.5.4 sedangkan saya tidak mengisytiharkan apa-apa?
Mungkin plugin yang melakukannya untuk anda: expo-audio menambah mod audio secara lalai, dan folder ios/ lama mungkin menyimpan kunci yang telah dibuang daripada konfigurasi anda. Semak dengan npx expo config --type introspect.

