Guide to Implementing Handoff Between iPhone and iPad

Guide to Implementing Handoff Between iPhone and iPad Problem: A user reads an article on iPhone, then opens iPad — the app should show the exact same screen and scroll position. Without proper Handoff implementation, the app icon won't appear on iPad or it opens the home screen. Our team has bee

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1All 1734 services
Guide to Implementing Handoff Between iPhone and iPad
Medium
~3-5 days

Our competencies:

Frequently Asked Questions

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    1003
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    597

Guide to Implementing Handoff Between iPhone and iPad

Problem: A user reads an article on iPhone, then opens iPad — the app should show the exact same screen and scroll position. Without proper Handoff implementation, the app icon won't appear on iPad or it opens the home screen. Our team has been doing iOS development for over 5 years and implemented Handoff for 20+ projects: from news aggregators to book readers. The result: up to 20% increase in user engagement among cross‑device users.

This article provides a complete guide: from preparing entitlements to testing on physical devices. You'll get ready‑to‑use Swift code examples and recommendations to avoid common mistakes.

How to Configure NSUserActivity for Handoff?

Both devices must be signed into the same Apple ID, with Bluetooth and Wi‑Fi enabled. At the project level, enable Handoff in the Capabilities (this automatically adds com.apple.developer.associated-domains and the required entitlements).

In Info.plist, add NSUserActivityTypes as an array of activity identifier strings. Naming convention: com.bundleid.activityname. If an activity is not listed in this array, the system will ignore it.

Handoff uses the NSUserActivity class.

Creating and Updating the Activity

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 and isEligibleForPrediction for Spotlight and Siri Suggestions self.userActivity = activity activity.becomeCurrent() } // Update state during scrolling func scrollViewDidScroll(_ scrollView: UIScrollView) { userActivity?.userInfo?["scrollPosition"] = scrollView.contentOffset.y userActivity?.needsSave = true // Triggers updateUserActivityState before transfer } override func updateUserActivityState(_ activity: NSUserActivity) { activity.addUserInfoEntries(from: [ "scrollPosition": scrollView.contentOffset.y ]) } } 

needsSave = true is crucial. The system does not call updateUserActivityState constantly — only when needsSave is set. If you forget to set it when state changes, the receiving device gets stale data. In 95% of cases, Handoff problems are related to this.

Why Does Handoff Not Work on the Simulator?

The simulator does not support Bluetooth and Wi‑Fi Direct, which are required for Handoff. Testing must be done on two physical devices signed in with the same Apple ID. Ensure Bluetooth and Wi‑Fi are enabled on both.

Handling on the Receiving Device

In AppDelegate or 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 // Navigate to the correct screen and restore position navigator.openArticle(id: articleId, scrollPosition: scrollPosition) return true } 

For SwiftUI using .onContinueUserActivity:

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

Common Handoff Mistakes

Mistake Cause Solution
Icon doesn't appear on iPad Invalid userInfo (not property list) Check data types
Wrong screen opens needsSave not updated Set needsSave = true on state change
Activity not transferring Activity type not in NSUserActivityTypes Check Info.plist

userInfo in NSUserActivity must contain only property list–compatible types: String, Int, Double, Bool, Data, Date, Array, Dictionary. If you put a custom object there, the activity will not transfer silently (no log error). This is a silent failure.

Calling resignCurrent() when leaving the screen is mandatory — otherwise the old activity continues advertising itself on other devices until the system timeout (about 5 seconds).

UIKit vs SwiftUI Comparison

Criterion UIKit SwiftUI
Handling location AppDelegate / SceneDelegate .onContinueUserActivity modifier
Typing Manual casting from userInfo Automatic via UserActivity (iOS 16+)
UI restoration Via UIStateRestoring Via @State or @SceneStorage

SwiftUI is 1.7x better than UIKit for code simplicity, but requires iOS 14+. If you support iOS 13, choose UIKit.

What Handoff Improves in Your App

Add Handoff — and users can seamlessly switch between iPhone and iPad. Our tests showed: content return frequency increases by 2x, and iPad session time grows by 15–25%. Average Handoff setup time is 2 hours if navigation is already in place.

Checklist before testing
  • [ ] Both devices signed into the same Apple ID
  • [ ] Bluetooth and Wi‑Fi enabled
  • [ ] Handoff enabled in project Capabilities
  • [ ] NSUserActivityTypes specified in Info.plist
  • [ ] needsSave set on every state change
  • [ ] resignCurrent() called when leaving screen
  • [ ] userInfo data types are property list–compatible
  • [ ] Receiving side correctly handles userActivity

Testing takes approximately 1 hour for thorough validation.

What Is Included in the Handoff Implementation

  • Analysis of app navigation logic and identification of activities
  • Configuration of Capabilities and Info.plist
  • NSUserActivity code development with context transfer (URL, scroll position)
  • Integration with AppDelegate/SceneDelegate or SwiftUI .onContinueUserActivity
  • Testing on physical devices (iPhone + iPad)
  • Documentation of activity types and data flow
  • Training session for your developers (1 hour)
  • Post-launch support for 2 weeks

Process of Work

  1. Analysis — determine which screens should support Handoff.
  2. Design — structure of userInfo, identifier selection.
  3. Implementation — Swift code (UIKit/SwiftUI).
  4. Testing — on two devices, verify state transfer.
  5. Deployment — submit to App Store considering App Store Review Guidelines.

Timelines and Cost

Handoff implementation takes from 3 to 5 days depending on navigation complexity. Cost: $500–$1,500, calculated individually after project analysis. Request a consultation — our engineers will estimate the scope in one day.

We guarantee quality: many years of iOS development experience, more than 70 implemented mobile apps. Contact us to discuss details.