לקוח פנה אלינו בבקשה לפתח אפליקציית AR לצפייה פנימית שיתופית: שני מעצבים עם iPads הממקמים בו-זמנית רהיטים במרחב וירטואלי משותף. ללא סנכרון, כל אחד ראה קבוצה שונה של אובייקטים, והחדר האמיתי הגיע לקואורדינטות שונות. הפתרון — Collaborative Session מ-ARKit. אבל היישום התברר כלא טריוויאלי: MultipeerConnectivity איבד חיבור מעת לעת, מפות לא התמזגו, ואובייקטים קפצו. להלן — כיצד אנו בונים סשן AR רב-מכשירי אמין, אילו מלכודות אנו נמנעים, ומה לשקול לפני תחילת הפיתוח. לוחות זמנים ותמחור נקבעים באופן אישי.
Collaborative Session מאפשר למספר מכשירי iOS להחליף מפות מרחביות בזמן אמת. בניגוד ל-Cloud Anchors, אין צורך באינטרנט — הנתונים מועברים ברשת המקומית עם חביון מתחת ל-20 אלפיות השנייה. יישמנו פרויקט עבור סטודיו לעיצוב שבו 3 משתתפים סונכרנו עם חביון מתחת ל-15 אלפיות השנייה; חיסכון בעלויות השרת הסתכם בכ-$1500 לחודש. עם זאת, טכנולוגיה זו פועלת רק על מכשירי Apple ורגישה לאיכות הרשת.
כיצד פועל Collaborative Session
הפעלת Collaborative Session דורשת רק שורה אחת בתצורה:
let config = ARWorldTrackingConfiguration() config.isCollaborationEnabled = true arView.session.run(config) לאחר מכן, ARKit מייצר חבילות let config = ARWorldTrackingConfiguration() config.isCollaborationEnabled = true arView.session.run(config) — מידע על סביבת המכשיר. יש לשלוח אותן לכל המשתתפים באמצעות תעבורה מתאימה: MultipeerConnectivity, WebSocket, או GameKit.
func session(_ session: ARSession, didOutputCollaborationData data: ARSession.CollaborationData) {
let encoded = try? NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: true)
// отправляем encoded всем пирам
}
// На принимающей стороне:
let data = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARSession.CollaborationData.self, from: received)
session.update(with: data)לאחר 10–30 שניות, המכשירים ממזגים את המפות שלהם — כל המשתתפים מקבלים מערכת קואורדינטות אחידה.
מדוע Collaborative Session מהיר יותר מ-Cloud Anchors
Collaborative Session הוא חלופה ישירה ל-Cloud Anchors. הנה השוואה:
| פרמטר | Collaborative Session | Cloud Anchors (ARCore) |
|---|---|---|
| חביון | <20 אלפיות השנייה (רשת מקומית) | 100–500 אלפיות השנייה (דרך שרת) |
| אינטרנט | לא נדרש | חובה |
| מספר מכשירים | עד 4–5 | כמעט בלתי מוגבל |
| פלטפורמה | רק iOS (ARKit) | Android, iOS (באמצעות ARKit+ARCore) |
| עלות שרת | אין | Google Cloud (תעבורה בתשלום) |
לתרחישים מקומיים (משרד, תערוכה), Collaborative Session מהיר ב-30–50% ואינו דורש שרתים חיצוניים. חיסכון בתשתית מגיע ל-50–60%.
כיצד להבטיח סנכרון אמין
- MultipeerConnectivity אינו אמין. MCSession מפיל עמיתים ללא שגיאות ברורות. פתרון: heartbeat של MultipeerConnectivity כל 2 שניות, חיבור מחדש אוטומטי לאחר שלוש פעמים ללא תגובה.
-
גודל חבילות CollaborationData. עם תנועת מצלמה פעילה, התעבורה מגיעה ל-50–100 KB/s למכשיר. עבור 4 משתתפים — עד 400 KB/s. עבור 5 מכשירים, היא יכולה להתקרב ל-500 KB/s. שלח CollaborationData דרך
ARSession.CollaborationData(ARKit מתאושש מחבילות שאבדו). שלח נתונים קריטיים (קואורדינטות אובייקטים) בערוץ אמין נפרד. - מנגנון Heartbeat. מפתחי ARKit המוסמכים שלנו עם ניסיון של 7+ שנים מבטיחים ש-heartbeat של MultipeerConnectivity מבטיח חיבורים יציבים.
מה קורה כשהמפות מתמזגות?
לפני המיזוג, לכל מכשיר יש מערכת קואורדינטות מקומית משלו. עוגנים שנוספו קודם לכן עשויים לקפוץ. עקוב אחר func session(_ session: ARSession, didOutputCollaborationData data: ARSession.CollaborationData) { let encoded = try? NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: true) // отправляем encoded всем пирам } // На принимающей стороне: let data = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARSession.CollaborationData.self, from: received) session.update(with: data) :
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
let participants = anchors.compactMap { $0 as? ARParticipantAnchor }
if !participants.isEmpty {
// Карты объединились — можно размещать объекты
enableObjectPlacement()
}
}מקם אובייקטים רק לאחר ש-.unreliable מופיע — אחרת דה-סנכרון הוא בלתי נמנע.
אילו נתונים מסונכרנים ב-Collaborative Session?
CollaborationData מכיל נקודות תכונה, מפת עומק ועוגנים. אובייקטים מותאמים אישית (למשל, רהיטים וירטואליים) אינם מסונכרנים אוטומטית — יש לשלוח את הקואורדינטות שלהם בנפרד. אנו ממליצים על ערוץ אמין למיקומי אובייקטים ו-.reliable עבור CollaborationData.
| סוג נתונים | ערוץ | מצב |
|---|---|---|
| CollaborationData | MultipeerConnectivity/WebSocket | לא אמין |
| קואורדינטות אובייקטים | ערוץ נפרד | אמין |
| אירועים (מיקום, מחיקה) | ערוץ נפרד | אמין |
התהליך שלנו: מניתוח ועד פריסה
- ניתוח מקרה שימוש ומגבלות רשת.
- עיצוב ארכיטקטורה: בחירת תעבורה, סכמת סנכרון.
- יישום ARWorldTrackingConfiguration ושכבת תעבורה.
- טיפול במחזור חיי סשן: גילוי משתתפים, מיזוג מפות, עזיבת עמית.
- בדיקה על מכשירים אמיתיים בתנאי רשת שונים.
מה כלול בעבודה שלנו
- ארכיטקטורת Collaborative Session עם בחירת תעבורה (MultipeerConnectivity, WebSocket, GameKit).
- יישום heartbeat, חיבור מחדש ו-buffering.
- סנכרון אובייקטים מותאמים אישית דרך ערוץ אמין נפרד.
- אינטגרציה עם ה-UI שלך: מיקום, מחיקה, הזזת אובייקטים.
- תיעוד וגישה לקוד המקור.
- הדרכת צוות (שעתיים אונליין) ותמיכה לאחר השקה (אחריות ל-7 ימים).
לוחות זמנים
Collaborative Session בסיסי עם MultipeerConnectivity — 2–3 שבועות. עם טיפול מלא במקרי קצה, סנכרון מצב ו-UI — 4–7 שבועות. עלות הפיתוח מתחילה ב-$5,000 לאינטגרציה בסיסית. ייעוץ זמין לפי בקשה.
טעויות יישום נפוצות
- אובדן חבילות במשלוח לא אמין אינו קריטי עבור CollaborationData — ARKit בונה מחדש את המפה.
- משלוח אמין של CollaborationData גורם לתורים ולפיגור — השתמש ב-
ARParticipantAnchor. - מיקום אובייקטים לפני מיזוג מפות גורם לרעידת עוגנים — המתן ל-
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) { let participants = anchors.compactMap { $0 as? ARParticipantAnchor } if !participants.isEmpty { // Карты объединились — можно размещать объекты enableObjectPlacement() } }. - משתתף שעוזב ללא ניקוי buffer צובר חבילות — נקה את ה-buffer בעת ניתוק.
אנחנו מוכנים לעזור בפרויקט ה-AR שלך.







