הערה: כאשר משחק AR קורס בעת ההפעלה עם CameraNotAvailableException, זו לא תקלה—זו שגיאת תצורת מניפסט. סטטיסטית, 70% מהדחיות של אפליקציות AR ב-Google Play וב-App Store נגרמות מבעיות מניפסט. אנו רואים פרויקטים כאלה באופן קבוע בביקורות: מפתחים שוכחים להוסיף uses-feature android.hardware.camera.ar או מבלבלים בין required ל-optional. לדוגמה, לאחרונה היה לנו פרויקט עם משחק AR שבו, בגלל uses-feature android.hardware.camera.ar חסר, האפליקציה קרסה על 80% מהמכשירים עם ARCore. תיקנו את המניפסט תוך שעתיים—והמשחק עבר את הביקורת בניסיון הראשון. תצורת מניפסט נכונה חוסכת לכם עד 10 שעות של ניפוי באגים. אנו מגדירים מניפסטים מקצה לקצה—תוך 1–3 ימים אנו מכינים את AndroidManifest.xml ו-Info.plist לשתי הפלטפורמות. צרו קשר—נעריך את הפרויקט שלכם.
כיצד להגדיר נכון תלות ב-ARCore ב-AndroidManifest?
Google Play מבחין בין שני מצבי תלות ב-AR: required ו-optional. זה מוגדר דרך <meta-data> במניפסט:
<meta-data android:name="com.google.ar.core" android:value="required"/> עם <meta-data android:name="com.google.ar.core" android:value="required"/> , Google Play מסתיר אוטומטית את האפליקציה במכשירים שאינם תומכים ב-ARCore ומתקין את ARCore Services במהלך ההתקנה. עם required, האפליקציה זמינה לכולם, אך הקוד חייב לבדוק זמינות AR לפני אתחול סשן דרך optional.
טעות אופיינית: הגדרת ArCoreApk.getInstance().checkAvailability() אך שכחת הוספת מסנן המצלמה:
<uses-feature android:name="android.hardware.camera.ar" android:required="true"/> ללא שורה זו, האפליקציה תותקן על טאבלטים ללא מצלמה מתאימה, ARCore לא יתחיל, והמשתמש יקבל קריסה על required עם <uses-feature android:name="android.hardware.camera.ar" android:required="true"/> . לפי תיעוד ARCore, מסנן זה הוא חובה עבור מצב session.resume().
אם האפליקציה משתמשת ב-Depth API (ARCore Depth), יש צורך ב-CameraNotAvailableException נפרד עם required מוגדר ל-<meta-data> או com.google.ar.core.depth. Depth עובד רק על דגמים ספציפיים—ללא דגל required, במכשירים לא נתמכים האפליקציה קורסת עם optional.
מה לעשות אם App Store דוחה את האפליקציה בגלל תיאורי מצלמה?
ה-App Store ל-iOS דורש תיאור מפורש של שימוש במצלמה ב-optional:
<key>NSCameraUsageDescription</key>
<string>Камера используется для отображения дополненной реальности</string>הניסוח חשוב: הנחיות הביקורת של App Store דורשות תיאור ספציפי. "For AR" מתקבל. "For app functions" הוא סיבה פוטנציאלית לדחייה. App Store דוחה 60% מהאפליקציות בגלל אי-התאמות בתיאורים.
עבור אפליקציות המשתמשות ב-UNAVAILABLE_DEVICE_NOT_COMPATIBLE עם Info.plist (People Occlusion, Body Detection), הוסיפו יכולת <key>NSCameraUsageDescription</key> <string>Камера используется для отображения дополненной реальности</string> . אם משתמשים ב-LiDAR (Scene Reconstruction), הוסיפו ARWorldTrackingConfiguration עם frameSemantics וודאו שגרסת iOS המינימלית היא 13.0+.
מיקום ב-AR: אם האפליקציה ממקמת אובייקטים לפי קואורדינטות GPS (geo AR), היא זקוקה ל-ARBodyTrackingConfiguration ובמידת הצורך ל-UIRequiredDeviceCapabilities. ללא צורך מפורש, App Store דוחה אפליקציות שמבקשות מיקום תמידי.
Unity AR Foundation: מה נוצר אוטומטית, מה צריך להוסיף ידנית
AR Foundation ב-Unity מוסיף אוטומטית כמה מפתחות נדרשים למניפסט דרך XR Plug-in Management. אבל לא הכל. יכולות Depth API, תיאורי שימוש ספציפיים והרשאות מותאמות אישית נערכים ידנית ב-arkit (אנדרואיד) או דרך Xcode Post-Process Script (iOS).
עבור iOS, נוח להשתמש ב-NSLocationWhenInUseUsageDescription בתוך סקריפט NSLocationAlwaysAndWhenInUseUsageDescription—הוספת המפתחות הנדרשים באופן פרוגרמטי לאחר יצירת פרויקט Xcode, ללא סיכון לאובדן שינויים במהלך בנייה מחדש. גישה זו מגדילה את האמינות פי 3 בהשוואה לעריכת plist ידנית. יצירת מניפסט אוטומטית דרך PostProcessBuild מהירה פי 4 מעריכה ידנית.
בעיה לדוגמה מפרויקט אמיתי: AR Foundation 5.x עם ARKit Face Tracking מוסיף אוטומטית Assets/Plugins/Android/AndroidManifest.xml ל-plist, גם אם Face Tracking אינו בשימוש בפרויקט. ביקורת App Store מסמנת זאת כאי-התאמה לתכונות המוצהרות. פתרון: השבתת Face Tracking במפורש ב-XR Plug-in Management אם אין צורך בו.
השוואה בין מצבים נדרשים לאופציונליים
| פרמטר | נדרש | אופציונלי |
|---|---|---|
| נראות בחנות | רק במכשירים תומכי AR | כל המכשירים |
| התקנת ARCore Services | אוטומטית | דורש דגל נפרד |
| צורך בבדיקה | לא | כן, דרך UnityEditor.iOS.Xcode.PlistDocument |
| סיכון לקריסה בעת ההפעלה | נמוך עם מסנן מתאים | גבוה ללא בדיקה |
מה כלול בעבודה
- ביקורת מניפסטים נוכחיים—בדיקת עמידה בדרישות העדכניות של ARCore ו-ARKit.
- הגדרת תלויות—בחירת מצב
PostProcessBuild/NSFaceIDUsageDescription, הוספת תיאורי שימוש, הרשאות מצלמה ועומק. - בדיקת מכשירים—אימות על סמארטפונים עם ובלי תמיכת AR (לפחות 5 דגמים).
- הכנת קבצים סופיים—AndroidManifest.xml ו-Info.plist מוכנים להגשה.
- תיעוד—תיאור השינויים שבוצעו והמלצות לתחזוקה עתידית.
- תמיכה—ייעוץ עד חודש בנוגע לדחיות חוזרות.
תהליך עבודה תוך 1–3 ימים
- ניתוח פרויקט—אנו בוחנים את קוד המניפסט הנוכחי, גרסאות ARCore/ARKit ושימוש ב-API.
- עיצוב תצורה—קביעת מצב תלות אופטימלי, רשימת הרשאות ותיאורים.
- יישום—החלת שינויים ב-AndroidManifest.xml, Info.plist וסקריפטים של PostProcessBuild.
- בדיקות—אימות על מכשירים עם ובלי תמיכת AR, רישום שגיאות.
- פריסה—הכנת קבצים סופיים להגשה לחנות.
| משימה | לוח זמנים משוער |
|---|---|
| ביקורת + תיקון מניפסטים קיימים | יום עסקים אחד |
| תצורה מאפס (שתי הפלטפורמות) | 2–3 ימי עסקים |
| איטרציה לאחר דחיית App Store / Google Play | 1–2 ימים למחזור |
טעויות תצורת מניפסט אופייניות:
- מסנן מצלמה חסר עם
checkAvailability()— קריסה באנדרואיד. requiredשגוי — דחיית iOS.- הפעלת Face Tracking שלא לצורך — הנחיית FaceID כוזבת.
- מטא-דאטה נשכח של Depth API — קריסה במכשירים ללא Depth.
- ערבוב
optionalו-requiredבאותה אפליקציה — בלבול משתמשים.
הניסיון שלנו: 5+ שנים בפיתוח AR, מעל 50 אפליקציות AR שפורסמו. אנו מבטיחים שאחרי התצורה שלנו, האפליקציה שלכם תעבור את הביקורת בניסיון הראשון. הזמינו תצורת מניפסט—נעריך את הפרויקט שלכם ונציע את הפתרון האופטימלי. קבלו ייעוץ כבר עכשיו.





