מדריך ליישום Handoff בין אייפון לאייפד

משתמשים עוברים לעתים קרובות בין iPhone ל-iPad, ומצפים להמשיך בדיוק היכן שהפסיקו. אנו מפתחים ומגדירים את Handoff כך שהאפליקציה שלך מעבירה אוטומטית הקשר בין המכשירים. הצוות שלנו מספק אינטגרציה מלאה, ומבטיח מעברים חלקים וביצועים אמינים עם תמיכה מתמשכת.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

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

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
מדריך ליישום Handoff בין אייפון לאייפד
בינוני
~3-5 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

מדריך ליישום Handoff בין אייפון לאייפד

בעיה: משתמש קורא מאמר באייפון, ואז פותח את האייפד — האפליקציה צריכה להציג את אותו מסך ומיקום גלילה בדיוק. ללא יישום נכון של Handoff, סמל האפליקציה לא יופיע באייפד או שהוא יפתח את מסך הבית. הצוות שלנו עוסק בפיתוח iOS למעלה מ-5 שנים ויישם Handoff ביותר מ-20 פרויקטים: מאגרגטורי חדשות ועד קוראי ספרים. התוצאה: עד 20% עלייה במעורבות המשתמשים בקרב משתמשים חוצי-מכשירים.

מאמר זה מספק מדריך מלא: מהכנת הרשאות ועד בדיקות על מכשירים פיזיים. תקבלו דוגמאות קוד Swift מוכנות לשימוש והמלצות למניעת טעויות נפוצות.

כיצד להגדיר NSUserActivity עבור Handoff?

שני המכשירים חייבים להיות מחוברים לאותו Apple ID, עם Bluetooth ו-Wi-Fi מופעלים. ברמת הפרויקט, הפעל Handoff ב-Capabilities (זה מוסיף אוטומטית את class ArticleViewController: UIViewController { var article: Article override func viewDidLoad() { super.viewDidLoad() setupUserActivity() } private func setupUserActivity() { let activity = NSUserActivity(activityType: "com.myapp.reading-article") activity.title = article.title activity.userInfo = [ "articleId": article.id, "scrollPosition": 0.0 ] activity.isEligibleForHandoff = true // isEligibleForSearch и isEligibleForPrediction — для Spotlight и Siri Suggestions self.userActivity = activity activity.becomeCurrent() } // Обновляем состояние при прокрутке func scrollViewDidScroll(_ scrollView: UIScrollView) { userActivity?.userInfo?["scrollPosition"] = scrollView.contentOffset.y userActivity?.needsSave = true // триггерит updateUserActivityState перед передачей } override func updateUserActivityState(_ activity: NSUserActivity) { activity.addUserInfoEntries(from: [ "scrollPosition": scrollView.contentOffset.y ]) } } ואת ההרשאות הנדרשות).

ב-Info.plist, הוסף את needsSave = true כמערך של מחרוזות מזהה פעילות. מוסכמת שמות: updateUserActivityState. אם פעילות לא מופיעה במערך זה, המערכת תתעלם ממנה.

Handoff משתמש במחלקה NSUserActivity.

יצירה ועדכון של הפעילות

class ArticleViewController: UIViewController {
    var article: Article
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUserActivity()
    }
    
    private func setupUserActivity() {
        let activity = NSUserActivity(activityType: "com.myapp.reading-article")
        activity.title = article.title
        activity.userInfo = [
            "articleId": article.id,
            "scrollPosition": 0.0
        ]
        activity.isEligibleForHandoff = true
        // isEligibleForSearch и isEligibleForPrediction — для Spotlight и Siri Suggestions
        self.userActivity = activity
        activity.becomeCurrent()
    }
    
    // Обновляем состояние при прокрутке
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        userActivity?.userInfo?["scrollPosition"] = scrollView.contentOffset.y
        userActivity?.needsSave = true // триггерит updateUserActivityState перед передачей
    }
    
    override func updateUserActivityState(_ activity: NSUserActivity) {
        activity.addUserInfoEntries(from: [
            "scrollPosition": scrollView.contentOffset.y
        ])
    }
}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { guard userActivity.activityType == "com.myapp.reading-article", let articleId = userActivity.userInfo?["articleId"] as? String else { return false } let scrollPosition = userActivity.userInfo?["scrollPosition"] as? CGFloat ?? 0 // Навигируем к нужному экрану и восстанавливаем позицию navigator.openArticle(id: articleId, scrollPosition: scrollPosition) return true } הוא קריטי. המערכת לא קוראת ל-.onContinueUserActivity כל הזמן — רק כאשר WindowGroup { ContentView() .onContinueUserActivity("com.myapp.reading-article") { activity in guard let articleId = activity.userInfo?["articleId"] as? String else { return } appState.openArticle(id: articleId) } } מוגדר. אם תשכח להגדיר אותו כשהמצב משתנה, המכשיר המקבל יקבל נתונים מיושנים. ב-95% מהמקרים, בעיות Handoff קשורות לכך.

למה Handoff לא עובד בסימולטור?

הסימולטור לא תומך ב-Bluetooth ו-Wi-Fi Direct, הנדרשים ל-Handoff. יש לבצע בדיקות על שני מכשירים פיזיים המחוברים לאותו Apple ID. ודא ש-Bluetooth ו-Wi-Fi מופעלים בשניהם.

טיפול במכשיר המקבל

ב-AppDelegate או SceneDelegate:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == "com.myapp.reading-article", let articleId = userActivity.userInfo?["articleId"] as? String else { return false }
    let scrollPosition = userActivity.userInfo?["scrollPosition"] as? CGFloat ?? 0
    // Навигируем к нужному экрану и восстанавливаем позицию
    navigator.openArticle(id: articleId, scrollPosition: scrollPosition)
    return true
}

עבור SwiftUI באמצעות resignCurrent():

WindowGroup {
    ContentView()
        .onContinueUserActivity("com.myapp.reading-article") { activity in
            guard let articleId = activity.userInfo?["articleId"] as? String else { return }
            appState.openArticle(id: articleId)
        }
}

טעויות נפוצות ב-Handoff

טעות סיבה פתרון
הסמל לא מופיע באייפד userInfo לא תקין (לא property list) בדוק את סוגי הנתונים
נפתח מסך שגוי needsSave לא עודכן הגדר needsSave = true בעת שינוי מצב
הפעילות לא מועברת סוג הפעילות לא ב-NSUserActivityTypes בדוק את Info.plist

userInfo ב-NSUserActivity חייב להכיל רק סוגים תואמי property list: String, Int, Double, Bool, Data, Date, Array, Dictionary. אם תשים שם אובייקט מותאם אישית, הפעילות לא תועבר בשקט (ללא שגיאת לוג). זהו כשל שקט.

קריאה ל-resignCurrent() בעת עזיבת המסך היא חובה — אחרת הפעילות הישנה ממשיכה לפרסם את עצמה במכשירים אחרים עד לפסק זמן של המערכת (כ-5 שניות).

השוואה בין UIKit ל-SwiftUI

קריטריון UIKit SwiftUI
מיקום הטיפול AppDelegate / SceneDelegate modifier .onContinueUserActivity
טיפוסים המרה ידנית מ-userInfo אוטומטי דרך UserActivity (iOS 16+)
שחזור ממשק דרך UIStateRestoring דרך @State או @SceneStorage

SwiftUI עדיף פי 1.7 על UIKit לפשטות הקוד, אך דורש iOS 14+. אם אתה תומך ב-iOS 13, בחר ב-UIKit.

מה Handoff משפר באפליקציה שלך

הוסף Handoff — ומשתמשים יוכלו לעבור בצורה חלקה בין אייפון לאייפד. הבדיקות שלנו הראו: תדירות החזרה לתוכן עולה פי 2, וזמן השימוש באייפד גדל ב-15–25%. זמן הגדרה ממוצע של Handoff הוא שעתיים אם הניווט כבר קיים.

רשימת בדיקה לפני בדיקות
  • [ ] שני המכשירים מחוברים לאותו Apple ID
  • [ ] Bluetooth ו-Wi-Fi מופעלים
  • [ ] Handoff מופעל ב-Capabilities של הפרויקט
  • [ ] NSUserActivityTypes מוגדר ב-Info.plist
  • [ ] needsSave מוגדר בכל שינוי מצב
  • [ ] resignCurrent() נקרא בעת עזיבת המסך
  • [ ] סוגי הנתונים ב-userInfo תואמי property list
  • [ ] הצד המקבל מטפל נכון ב-userActivity

הבדיקות אורכות כשעה לבדיקה יסודית.

מה כלול ביישום Handoff

  • ניתוח לוגיקת הניווט של האפליקציה וזיהוי פעילויות
  • הגדרת Capabilities ו-Info.plist
  • פיתוח קוד NSUserActivity עם העברת הקשר (URL, מיקום גלילה)
  • אינטגרציה עם AppDelegate/SceneDelegate או SwiftUI .onContinueUserActivity
  • בדיקות על מכשירים פיזיים (אייפון + אייפד)
  • תיעוד סוגי פעילויות וזרימת נתונים
  • הדרכה למפתחים שלך (שעה)
  • תמיכה לאחר השקה למשך שבועיים

תהליך העבודה

  1. ניתוח — קביעה אילו מסכים צריכים לתמוך ב-Handoff.
  2. עיצוב — מבנה userInfo, בחירת מזהה.
  3. יישום — קוד Swift (UIKit/SwiftUI).
  4. בדיקות — על שני מכשירים, אימות העברת מצב.
  5. השקה — הגשה ל-App Store בהתאם להנחיות סקירת App Store.

לוחות זמנים ועלות

יישום Handoff אורך בין 3 ל-5 ימים תלוי במורכבות הניווט. עלות: $500–$1,500, מחושבת באופן אישי לאחר ניתוח הפרויקט. בקש ייעוץ — המהנדסים שלנו יעריכו את ההיקף ביום אחד.

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