iOS 9 デバイスを搭載した iPhone 5 および iPad Air で Handoff 機能を強制的に動作させようとすると、iOS9 関連と思われる問題が発生します。このシステムを搭載したデバイスがないため、iOS 8 では確認できません。
問題:
- ユーザー アクティビティが作成されたときのメイン画面で、最初のデバイスでアプリを開いています
- 2 番目のデバイスのロック画面に、アプリに関連するアクティビティがあることがわかります
- このアプリを開いて
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
}
}
前もって感謝します!