【问题标题】:Handoff does not work with iOS 9 devicesHandoff 不适用于 iOS 9 设备
【发布时间】:2023-12-19 20:53:02
【问题描述】:

尝试强制 Handoff 功能在配备 iOS 9 设备的 iPhone 5 和 iPad Air 上运行,但遇到了我认为与 iOS9 相关的问题 - 无法在 iOS 8 上检查,因为我没有配备此系统的设备。

问题

  1. 创建用户活动时,我在主屏幕上打开第一台设备上的应用程序
  2. 在第二台设备上,我在锁定屏幕上看到有一些与我的应用相关的活动
  3. 我正在打开此应用程序,但未在此设备上调用 application:continueUserActivity:restorationHandler:,因此我无法向用户显示在第一台设备上显示的相同内容。

您可以在github上浏览整个项目:https://github.com/tomkowz/Quotes

实现细节

我已经更新了目标的 plist 文件并添加了NSUserActivityTypes

<key>NSUserActivityTypes</key>
<array>
    <string>com.tomaszszulc.Quotes.quotesList</string>
    <string>com.tomaszszulc.Quotes.browseQuote</string>
</array>

接下来我用这些声明的类型创建了枚举:

enum ActivityType: String {
    case BrowseQuote = "com.tomaszszulc.Quotes.browseQuote"
    case QuotesList = "com.tomaszszulc.Quotes.quotesList"
}

当用户在主屏幕上时,我开始NSUserActivity

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    quotes = Quote.findAll(CoreDataStack.sharedInstance().mainContext)
    tableView.reloadData()
    startUserActivity()
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    userActivity?.invalidate()
}

func startUserActivity() {
    let activity = NSUserActivity(activityType: ActivityType.QuotesList.rawValue)
    activity.title = "Viewing Quotes List"
    userActivity = activity
    userActivity?.becomeCurrent()
}

当用户转到所选项目的详细信息时,会激活第二种活动。这是视图流:

UINavigationController -> (root) QuotesListViewController -> (push) QuoteDetailsViewController

这是QuoteDetailsViewController中创建用户活动的代码:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    userActivity = viewModel.userActivity // (viewModel) quote.userActivity
    userActivity?.becomeCurrent()
}

override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    userActivity?.invalidate()
}

viewModel.userActivity 调用:

extension Quote {
    @available(iOS 8.0, *)
    var userActivity: NSUserActivity {
        let activity = NSUserActivity(activityType: ActivityType.BrowseQuote.rawValue)
        activity.title = "Reading " + self.author + " quote"
        activity.userInfo = [QuoteUserActivityKey.Identifier.rawValue: self.identifier]
        // Core Spotlight support
        if #available(iOS 9.0, *) {
            activity.contentAttributeSet = self.searchableItemAttributeSet()
            activity.keywords = Set([self.author])
            activity.eligibleForSearch = true
            activity.eligibleForHandoff = true
        }

        return activity
    }
}

提前谢谢你!

【问题讨论】:

标签: swift swift2 ios9 handoff xcode7-beta3


【解决方案1】:

如果您在第二台设备上获得指示它正在看到潜在的切换,那么application:continueUserActivity:restorationHandler:不被调用的唯一“好”原因是:

如果 application:willFinishLaunchingWithOptions: 或 application:didFinishLaunchingWithOptions: 返回 NO,则不会调用此方法。

切换“不起作用”的另一个原因是设备未登录到同一个 iCloud 帐户。但是你看到了指标,所以你的情况不是这样。

【讨论】: