# Guideline 2.5.4: Apple דוחה מצב רקע באפליקציה

> Guideline 2.5.4: Apple דוחה מצב רקע שהוצהר בלי פיצ'ר שמשתמש בו. תסיר את המפתח או תראה לבודק את הצליל, המיקום או השיחה.

עמוד מקורי: [Guideline 2.5.4: Apple דוחה מצב רקע באפליקציה](https://devoria.fr/he/blog/guideline-2-5-4-background-mode-rejected)
כותב: [Mehdi Azizi](https://devoria.fr/he/mehdi-azizi)
פרסום: 2026-11-04
עדכון תוכן אחרון: 2026-11-04


הנחיה 2.5.4 מגבילה את מצבי הרקע לשימוש שלשמו הם נועדו: צליל, מיקום, שיחות VoIP, סיום משימה, התראות מקומיות. הדחייה מגיעה כשה-Info.plist שלך מצהיר על אחד מהמצבים האלה והבודק לא מוצא שום פיצ'ר שצריך אותו. **אם שום דבר לא משתמש במפתח, תסיר אותו. אחרת, תראה לבודק את הפיצ'ר תוך שלושים שניות.**

אני מפרסם את אפליקציות ה-iOS שלי עם Expo. Solys, השעון המעורר שלי עם מיני-משחקים, מצהיר על מצב audio: הסרתי אותו, ואז החזרתי אותו מסיבה אחרת. המדריך הזה מבוסס על הטקסט של Apple, על דחיות שמפתחים אחרים פרסמו ועל הפרויקטים שלי. לתמונה הכללית של סיבות הדחייה, תקרא [למה Apple דוחה אפליקציה](https://devoria.fr/he/blog/apple-app-rejection-reasons-real-cases).

## מה אומרת הנחיה 2.5.4?

הכלל נכנס במשפט אחד, בסעיף 2 "Performance", חלק 2.5 "Software Requirements", של ה-[App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#2.5.4): "Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc."

בפשטות: שירות רקע משמש רק למה שבשבילו הוא קיים. מכאן הכותרת "Guideline 2.5.4 - Performance - Software Requirements".

כברירת מחדל, אפליקציה שעוברת לרקע מושהית. כדי להמשיך לרוץ, היא מצהירה על מצב אחד או יותר במפתח `UIBackgroundModes` של ה-Info.plist שלה. [התיעוד של Apple על מצבי רקע](https://developer.apple.com/documentation/xcode/configuring-background-execution-modes) מבקש להשתמש בהם במשורה, בגלל הסוללה, ולהעדיף פתרון אחר כשיש כזה. **כל מצב שמוצהר הוא הבטחה שהבודק יכול לבדוק.**

## מצבי הרקע והשימוש שלשמו הם נועדו

| מצב                   | מפתח                  | שימוש מיועד         |
| --------------------- | --------------------- | ------------------- |
| Audio, AirPlay, PiP   | `audio`               | צליל שנשמע ברקע     |
| מיקום                 | `location`            | מיקום רציף          |
| Voice over IP         | `voip`                | שיחות עם CallKit    |
| Background fetch      | `fetch`               | תוכן רשת באופן קבוע |
| Background processing | `processing`          | משימות מתוזמנות     |
| Remote notifications  | `remote-notification` | Push של תוכן חדש    |

הטבלה הזו מסכמת את הדף של Apple. בדחיות שמתפרסמות בפורומים, `audio`, `location` ו-`voip` חוזרים הכי הרבה.

## מה אומרת הודעת הדחייה של 2.5.4?

ההודעה מציינת את המצב הבעייתי. שתי דוגמאות שמפתחים פרסמו בפורומים של 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." ההמשך מבהיר שהמפתח `audio` מיועד לאפליקציות שמשמיעות תוכן ברקע, כמו נגן מוזיקה. הוא מציע שתי דרכים: להוסיף תוכן כזה או להסיר את המפתח ([השרשור בפורום](https://developer.apple.com/forums/thread/95216)).
- **מיקום**: ב[שרשור מדצמבר 2024](https://developer.apple.com/forums/thread/771202), Apple לא מצאה שום פיצ'ר מלבד מעקב אחרי עובדים שדורש מיקום קבוע, וכתבה שהשימוש הזה לבדו לא מתאים.

איך אני קורא את זה: **הבודק לא קורא את הקוד שלך, הוא מחפש פיצ'ר.** הוא צריך להיות מסוגל להפעיל אותו, להעביר את האפליקציה לרקע ולראות שהיא ממשיכה.

יש גם מקרה הפוך. ב[שרשור ממאי 2026](https://developer.apple.com/forums/thread/826849), אפליקציה להקראה בקול, שבאמת השתמשה במצב `audio`, נדחתה כמה פעמים: הבודק לא הצליח להפעיל את הצליל. מפתח אחר כותב שם שלדעתו סרטון מצורף הוא מה ששחרר את המקרה שלו. זו עדות, לא כלל של Apple.

## מאיפה המפתח הגיע אם לא הוספת אותו?

עם Expo, תוספי הקונפיגורציה (config plugins) הם אלה שממלאים את ה-Info.plist בזמן ה-prebuild. **כלומר, מצב רקע יכול להיכנס לבינארי שלך בלי שהחלטת על זה.**

### התוסף expo-audio, בהגדרות ברירת המחדל

[התיעוד של expo-audio](https://docs.expo.dev/versions/latest/sdk/audio/) אומר את זה: האפשרות `enableBackgroundPlayback` שווה `true` כברירת מחדל, וב-iOS היא מוסיפה את מצב `audio`. כלומר, מספיק להצהיר על התוסף בצורה הקצרה, `"expo-audio"`, כדי להצהיר על המצב.

זה מה שמצאתי כשעברתי על TradaZen לפני ההגשה הראשונה שלה: צלילי ממשק קצרים בחזית, אבל תוסף שהוצהר בצורה קצרה. התיקון נכנס ב-`app.json`:

```json
{
  "expo": {
    "plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
  }
}
```

חבילות אחרות מוסיפות מצב בדרך שלהן. האפשרות `isIosBackgroundLocationEnabled` של [expo-location](https://docs.expo.dev/versions/latest/sdk/location/) מוסיפה `location` רק אם אתה מפעיל אותה. [expo-background-task](https://docs.expo.dev/versions/latest/sdk/background-task/), לעומת זאת, מוסיף `processing` ב-prebuild ברגע שהוא מותקן.

### תיקיית ios/ שמחזיקה את המפתח הישן

מלכודת שנייה, שנפלתי בה עם Solys ביולי 2026. הסרתי את `audio` מ-`app.json`, אבל המפתח נשאר ב-`ios/Solys/Info.plist`, שנוצר קודם. prebuild בלי `--clean` משנה את הפרויקט הזה במקום ליצור אותו מחדש, והתוסף מוסיף את המפתח בלי להסיר אותו אף פעם. build מקומי היה מכניס אותו. build של EAS בענן מתחיל מ-prebuild חדש כש-`ios/` מוחרג ב-git, וזה היה המצב אצלי.

לפני כל build, אני בודק מה באמת ייצא:

```bash
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
```

הפקודה הראשונה מציגה את המצבים שה-prebuild יכתוב ב-Info.plist. השנייה יוצרת מחדש את הפרויקט הנייטיב ל-build מקומי, ומוחקת את תיקיית `ios/`. ב-Solys, הראשונה מציגה `"UIBackgroundModes":["audio"]`, ב-TradaZen כלום: שני המצבים מכוונים.

הוספה או הסרה של מצב משנה את ה-Info.plist, כלומר את הבינארי: **צריך build חדש, עדכון מרחוק לא מספיק.** [התיעוד של EAS Update](https://docs.expo.dev/eas-update/introduction/) מסווג שינויים כאלה בין אלה שדורשים בינארי חדש, כמו ב-[ITMS-90683](https://devoria.fr/he/blog/itms-90683-missing-purpose-string-expo).

## Solys: מצב audio מוצהר, עם סיבה אמיתית

Solys הוא שעון מעורר, אבל מצב `audio` לא משמש להשמעת ההתראה: **הצלצול עובר דרך AlarmKit**, שירות ההתראות של Apple שזמין מאז iOS 26 ([התיעוד של AlarmKit](https://developer.apple.com/documentation/alarmkit)). המערכת היא זו שמצלצלת, גם במצב שקט, לא האפליקציה.

ההיסטוריה של המפתח, כי ההיגיון חשוב יותר מהשורה:

1. **בסוף יולי 2026 הסרתי אותו.** שום דבר לא השמיע צליל ברקע: אפקטי הסאונד של המיני-משחקים נשארים בחזית, וההתראה לא תלויה באפליקציה.
2. **יומיים אחר כך החזרתי אותו**, עם האזנת הלילה. האפשרות הזו מקליטה את רעשי הלילה שלך עם המיקרופון ומנתחת אותם על האייפון. ההקלטה צריכה להמשיך כשהמסך נעול, והתיעוד של expo-audio מציין שגם אפשרות ההקלטה ברקע מוסיפה את מצב `audio`.

ההצדקה שינתה את אופייה: **המצב משמש להקלטה, לא להשמעה.** שלושה אמצעי הגנה, גלויים באפליקציה:

- ההאזנה היא אפשרות כבויה כברירת מחדל, שמופעלת מההגדרות או מטקס הערב;
- יש לה מסך הסכמה משלה, כמו ש[כלל 2.5.14](https://developer.apple.com/app-store/review/guidelines/#2.5.14) דורש לכל הקלטה, ושום דבר לא יוצא מהטלפון;
- המיקרופון נסגר עשר דקות לפני ההתראה, כדי שההאזנה והצלצול אף פעם לא יפריעו זה לזה.

אני לא יכול להבטיח שבודק תמיד יקבל את ההצהרה הזו. אני כן יודע להסביר, לכל רכיב, למה הוא משמש ואיפה רואים אותו.

### שעונים מעוררים שהשאירו את האפליקציה ערה

לפני AlarmKit, אפליקציית שעון מעורר של צד שלישי לא יכלה לצלצל כמו ההתראה של Apple. לכן ספריות מסוימות השאירו את האפליקציה ערה: התיעוד של חבילת Flutter‏ [alarm2](https://pub.dev/packages/alarm2) מתאר נגן אודיו שקט שרץ עד ההתראה. אבל צליל מושתק לא משמיע כלום. **מאז iOS 26, AlarmKit הופך את העקיפה הזו למיותרת.**

## להשאיר או להסיר את המצב: טבלת החלטה

| המצב שלך             | מה לעשות                |
| -------------------- | ----------------------- |
| צלילים קצרים בחזית   | להסיר את `audio`        |
| מוזיקה או ספר שמע    | להשאיר, ולהראות את זה   |
| הקלטה ארוכה          | להשאיר + הסכמה          |
| שעון מעורר או טיימר  | AlarmKit (iOS 26)       |
| מיקום מדי פעם        | שינויים משמעותיים       |
| סנכרון לא דחוף       | `fetch` או `processing` |
| שיחות אודיו או וידאו | `voip` עם CallKit       |

לגבי מיקום, הדף של Apple מציין את שירות השינויים המשמעותיים (significant location changes) כחלופה למצב `location`.

## הסעיפים האחרים של 2.5: ‏2.5.1 ו-2.5.2

### 2.5.1: API ציבוריים ו-frameworks במקום שלהם

"Apps may only use public APIs and must run on the currently shipping OS." האפליקציה משתמשת רק ב-API ציבוריים, רצה על הגרסה הנוכחית של המערכת ונוטשת את מה שהוצא משימוש. כמו ב-2.5.4, כל framework משמש לשימוש המיועד שלו, שמוזכר בתיאור: HealthKit לבריאות, HomeKit לבית החכם. אם ספרייה קוראת ל-API פרטי, האפליקציה שלך היא זו שתיפול בדחייה.

### 2.5.2: בלי קוד שמורד ומשנה את האפליקציה

האפליקציה נשארת עצמאית בתוך החבילה שלה. היא לא יכולה "download, install, or execute code which introduces or changes features or functionality of the app". רק לאפליקציות חינוכיות שמלמדות לתכנת יש חריגה מוגבלת, עם קוד שגלוי לגמרי למשתמש וניתן לעריכה על ידו.

עם Expo, השאלה נוגעת ב-EAS Update, שהתיעוד שלו מזכיר שעדכונים חייבים לעמוד בכללי ה-App Store. **תשמור את העדכונים מרחוק לתיקונים, אף פעם לא כדי לשחרר פיצ'ר שהבודק לא ראה.** תיקון שקשור לבדיקה עובר דרך build חדש, כמו שאני מסביר במדריך של [הנחיה 2.1](https://devoria.fr/he/blog/guideline-2-1-app-store-rejection-fix).

## איך לענות לדחייה של 2.5.4?

השיחה מתנהלת בחלק App Review של האפליקציה שלך, שם אתה [עונה להודעה של App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/). שני מקרים:

- **המצב לא משמש לכלום**: תסיר אותו, תעשה build מחדש, תבדוק את ה-introspection, ואז תענה בשני משפטים.
- **המצב משמש פיצ'ר אמיתי**: תענה עם המסלול המדויק וסרטון קצר, ואז תעתיק את הטקסט הזה להערות לבודק (review notes) בכל גרסה.

התבנית שהייתי משתמש בה, להתאמה (תמחק את המשפט על ההתראה אם אין באפליקציה שלך כזו):

```text
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,
```

## צ'קליסט 2.5.4 לפני הגשה

- ה-introspection של Expo מציג רק את המצבים שרצית, ואתה יודע לציין את הפיצ'ר של כל אחד.
- אף תוסף לא מוצהר בצורה קצרה אם הוא מוסיף מצב כברירת מחדל, כמו expo-audio.
- תיקיית `ios/` המקומית שלך לא מחזיקה שום מפתח ישן, או שאתה מקמפל מ-prebuild נקי.
- הפיצ'ר מופעל מהר, בלי הגדרה מוסתרת, וההערות לבודק אומרות איזה מצב משמש למה ואיך לבדוק אותו.
- כל הקלטה מבקשת הסכמה מפורשת ומציגה אינדיקטור גלוי. הכללים על בקשות הרשאה נמצאים במדריך של [הנחיה 5.1.1](https://devoria.fr/he/blog/guideline-5-1-1-app-store-rejection-fix).
- בשעון מעורר, הצלצול עובר דרך AlarmKit, לא דרך צליל שמושמע מהאפליקציה.

## לבדוק את התיק שלך לפני השליחה

ה-[Review Kit](https://devoria.fr/he/kits/app-review) מרכז את הצ'קליסט שלי לפני השליחה, תבניות של הערות לבודק ו-skills של Claude Code שעוברים על הפרויקט שלך. לעין אנושית, [תקבע איתי שעה](https://devoria.fr/he/coaching): נקרא יחד את ההודעה של Apple ואת ה-Info.plist שלך, בשיחת וידאו. התהליך המלא נמצא בדף [אפליקציה שנדחתה על ידי Apple](https://devoria.fr/he/expertise/app-rejected-by-apple).

מכין את ההשקה הראשונה שלך? [תעשה את האבחון החינמי](https://devoria.fr/he/diagnostic): הוא מסדר את השלבים לפי הסדר ושולח לך את הצ'קליסט שלי נגד דחיות של Apple.

אף אחד לא יכול להבטיח ש-Apple תאשר את האפליקציה שלך. מצב רקע עם הצדקה טובה, לעומת זאת, אפשר להגן עליו בשלושים שניות.

## שאלות נפוצות

### מה פירוש "Guideline 2.5.4 - Performance - Software Requirements"?

זו הכותרת של הדחייה כש-Apple חושבת שמצב רקע ב-Info.plist שלך לא משמש לשימוש המיועד שלו. ההודעה מציינת את המצב ומציעה להראות את הפיצ'ר שמשתמש בו או להסיר את המפתח.

### צריך build חדש אחרי דחייה של 2.5.4?

אם אתה מסיר או משנה מצב, כן: המפתח נמצא ב-Info.plist, כלומר בבינארי. אם המצב מוצדק, תשובה עם המסלול המדויק וסרטון יכולה להספיק.

### אפשר להשאיר את מצב audio בשביל כמה צלילי ממשק?

לא. צלילים קצרים שמושמעים בחזית לא צריכים אותו. עם Expo, תגדיר את `enableBackgroundPlayback` ל-`false` בתוסף expo-audio.

### אפליקציית שעון מעורר צריכה את מצב audio?

לא בשביל לצלצל, אם היא נשענת על AlarmKit, שזמין מאז iOS 26: המערכת היא זו שמשמיעה את ההתראה. ב-Solys, מצב `audio` משמש להאזנת הלילה, שמקליטה כשהמסך נעול.

### למה Apple מצטטת את 2.5.4 כשלא הצהרתי על כלום?

כנראה תוסף עשה את זה בשבילך: expo-audio מוסיף את מצב `audio` כברירת מחדל, ותיקיית `ios/` ישנה יכולה להחזיק מפתח שהסרת מהקונפיגורציה. תבדוק עם `npx expo config --type introspect`.


## הפרויקט שלך

[Review Kit](https://devoria.fr/he/kits/app-review): הצ'קליסט שלי לבדיקת App Store, הדחיות שקיבלתי מ-Apple ואיך תיקנתי אותן, הצ'קליסט ל-Google Play ושלושה skills ל-Claude Code. ‏169 ‏⁦₪⁩.

[iOS & Android Kit](https://devoria.fr/he/kits/ios): תבנה אפליקציה לאייפון ולאנדרואיד עם Claude Code: קוד ההתחלה של האפליקציות שלי, כל הדרך עד החנויות וכל הקיטים. ‏349 ‏⁦₪⁩.

[אבחון: מה מפריד בינך לבין אפליקציית האייפון שלך](https://devoria.fr/he/diagnostic): 7 שאלות, 60 שניות: תדע מה באמת חוסם אותך מלפרסם את אפליקציית האייפון שלך, תקבל מסלול ב-4 שלבים ואת הקיט שמתאים לך.
