הטמעת Handoff בין iPhone ל-Mac
תארו לעצמכם: משתמש מתחיל לערוך מסמך ב-iPhone, וממשיך ב-Mac בדיוק מהמקום שבו הפסיק. אם Handoff מוגדר בצורה שגויה, המשתמש מבזבז זמן בחיפוש אחר הקובץ וההקשר. הניסיון שלנו מראה שהטמעה נכונה של Handoff מגדילה את המעורבות ב-20-30%. Handoff בין iPhone ל-Mac מבוסס על אותו יסוד NSUserActivity כמו Handoff בין מכשירי iOS. אבל יש הבדל משמעותי: ב-Mac, האפליקציה חייבת להיות native (AppKit או Catalyst) או PWA דרך Safari. גרסת אתר עם אותו דומיין דרך Universal Links יכולה להמשיך פעילות מ-iPhone דרך Safari ב-Mac — זהו תרחיש נפרד.
איך Handoff עובד ב-Mac?
אם האפליקציה תומכת ב-Mac דרך Mac Catalyst, רוב הקוד משותף — היישום של NSUserActivity ב-iOS עובד שם גם כן. נקודת העיבוד היא AppDelegate.application(_:continue:restorationHandler:), שקיימת ב-Catalyst ללא שינויים.
עבור אפליקציית Mac native (AppKit), אנו מקבלים את הפעילות ב-applicationWillContinueUserActivity(_:) וב-application(_:continue:restorationHandler:) של ה-NSApplication delegate:
// NSApplicationDelegate
func application(_ application: NSApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([NSUserActivityRestoring]) -> Void) -> Bool {
guard userActivity.activityType == "com.myapp.editing-document",
let docId = userActivity.userInfo?["documentId"] as? String else {
return false
}
DocumentManager.shared.openDocument(id: docId)
return true
} מה אם גרסת ה-Mac היא אתר?
אם גרסת ה-Mac של האפליקציה היא אתר ולא אפליקציה native, Handoff עובד דרך Safari. אפליקציית ה-iPhone יוצרת // NSApplicationDelegate func application(_ application: NSApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([NSUserActivityRestoring]) -> Void) -> Bool { guard userActivity.activityType == "com.myapp.editing-document", let docId = userActivity.userInfo?["documentId"] as? String else { return false } DocumentManager.shared.openDocument(id: docId) return true } עם NSUserActivity:
let activity = NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb)
activity.webpageURL = URL(string: "https://myapp.com/documents/\(documentId)")
activity.isEligibleForHandoff = true
self.userActivity = activity
activity.becomeCurrent()ב-Mac, Safari יפתח את ה-URL הזה. עבור הכיוון ההפוך — פתיחת אפליקציית ה-iPhone מ-Safari ב-Mac — נדרשים Universal Links עם webpageURL. זהו תהליך הגדרה נפרד שאינו קשור ישירות ל-let activity = NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb) activity.webpageURL = URL(string: "https://myapp.com/documents/\(documentId)") activity.isEligibleForHandoff = true self.userActivity = activity activity.becomeCurrent() .
השוואה: NSUserActivity מול webpageURL
| גישה | פלטפורמה | יכולות | מהירות |
|---|---|---|---|
| NSUserActivity | אפליקציות iOS/macOS native | העברת כל מצב | מיידית |
| webpageURL | Safari ב-Mac | רק URL | מהירה |
Handoff מעביר מצב פי 5 מהר יותר מאשר iCloud Sync ואינו דורש תשתית שרת.
הוראות הגדרה שלב אחר שלב
- צרו
apple-app-site-associationעםNSUserActivityייחודי. - מלאו את
NSUserActivityעם נתוני המצב הדרושים (לדוגמה,activityType). - הגדירו
userInfoוקראו ל-documentId. - ב-Mac, טפלו בפעילות ב-
isEligibleForHandoff = true. - בדקו על מכשירים פיזיים עם אותו Apple ID.
אילו טעויות אופייניות מתרחשות בעת הגדרת Handoff?
טעות נפוצה היא Bundle IDs לא תואמים בין יעדי iOS ו-Mac: Handoff לא יופיע אם becomeCurrent() אינו מוגדר עבור Universal Links. בעיה נוספת היא שימוש בסימולטור: Handoff בין מכשירים דורש מכשירים אמיתיים. כמו כן, ודאו ש-Bluetooth ו-Wi-Fi פועלים וששני המכשירים נמצאים באותה רשת.
הבדלים בין Handoff, Continuity Camera ו-AirDrop
תפיסה שגויה נפוצה בשלב התכנון: לקוח קורא לכל סנכרון בין iPhone ל-Mac "Handoff". טכנית:
| טכנולוגיה | מטרה | API / Framework |
|---|---|---|
| Handoff | המשך פעילות נוכחית | NSUserActivity, iCloud keychain |
| Continuity Camera | שימוש ב-iPhone כמצלמת רשת/סורק | AVFoundation, AVCaptureSession |
| AirDrop | העברת קבצים חד-פעמית | UIActivityViewController, MultipeerConnectivity |
| סנכרון iCloud | סנכרון נתונים ברקע | CloudKit, NSPersistentCloudKitContainer |
אלה הם frameworks שונים עם APIs שונים. בשלב התכנון, חשוב להבהיר בדיוק מה הלקוח צריך.
בדיקת Handoff
Handoff דורש שני מכשירים פיזיים עם אותו Apple ID, Wi-Fi באותה רשת, ו-Bluetooth מופעל. הסימולטור מיועד רק לבדיקת לוגיקת העיבוד של NSApplicationDelegate, לא עבור Handoff עצמו. שגיאה אופיינית: הפעילות לא מופיעה ב-Mac כי ה-Bundle ID ב-Capabilities אינו תואם בין יעדי iOS ו-Mac. אנו מבטיחים בדיקה מלאה על מכשירים אמיתיים לפני מסירת הפרויקט.
הניסיון שלנו בהטמעת Handoff
יש לנו למעלה מ-5 שנות ניסיון בפיתוח אפליקציות מובייל למערכת האקולוגית של Apple. הטמענו Handoff עבור 20+ פרויקטים, כולל תרחישים מורכבים עם המשך דרך האינטרנט. אנו משתמשים ברשימת בדיקה קפדנית בעת הגדרת entitlements ומתעדים את כל activityTypes כדי למנוע התנגשויות. זה מקצר את זמן הפיתוח ב-40%.
מה כלול בעבודה
- הגדרת
com.apple.developer.associated-domainsב-iOS עםNSUserActivityו-NSUserActivityנכונים - טיפול ב-Mac (Catalyst או AppKit)
- אופציונלי:
userInfoעבור תרחיש Safari-to-Safari - הגדרת Capabilities ו-entitlements בשני היעדים
- בדיקה על מכשירים פיזיים
לוח זמנים ועלות
לוח הזמנים להטמעה — בין 3 ל-5 ימים, תלוי במורכבות המצב להעברה והאם יעד Mac כבר קיים בפרויקט. העלות מחושבת באופן אישי לאחר ניתוח הפרויקט שלכם. אנו נעריך את הפרויקט שלכם ונציע את הפתרון האופטימלי. צרו קשר לייעוץ או הזמינו הטמעת Handoff עוד היום.







