0

iOS 9 デバイスを搭載した iPhone 5 および iPad Air で Handoff 機能を強制的に動作させようとすると、iOS9 関連と思われる問題が発生します。このシステムを搭載したデバイスがないため、iOS 8 では確認できません。

問題:

  1. ユーザー アクティビティが作成されたときのメイン画面で、最初のデバイスでアプリを開いています
  2. 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 を作成しました。

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()
}

2 番目のタイプのアクティビティは、ユーザーが選択したアイテムの詳細に移動したときにアクティブになります。ビュー フローは次のとおりです。

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
    }
}

前もって感謝します!

4

1 に答える 1

1

2 番目のデバイスでハンドオフの可能性があるというインジケーターを取得している場合、呼び出されない唯一の「正当な」理由application:continueUserActivity:restorationHandler:は次のとおりです。

application:willFinishLaunchingWithOptions: または application:didFinishLaunchingWithOptions: が NO を返す場合、このメソッドは呼び出されません。

ハンドオフが「機能しない」もう 1 つの理由は、デバイスが同じ iCloud アカウントにログインしていない場合です。しかし、インジケーターが表示されるので、あなたの場合はそうではありません。

于 2015-09-05T15:48:49.717 に答える