iOS の Spotlight のプライベート インデックスによって NSUserActivity のインデックスを作成しようとしています。Apple のインデックス アクティビティとナビゲーション ポイントガイドのすべての手順に従いましたが、スポットライトによってアクティビティがまったくインデックスされていないようです。
ガイドには次のように書かれています。
アクティビティとそのメタデータが確実にインデックス化されるようにするには、アクティビティがインデックスに追加されるまで、アクティビティへの強い参照を保持する必要があります。これには 2 つの方法があります。最初の方法は、アクティビティを作成するコントローラ オブジェクトのプロパティにアクティビティを割り当てることです。2 番目の方法は、UIResponder オブジェクトの userActivity プロパティを使用することです。
私は最初のオプションを選択しました (NSUserActivity を保持するためにビュー コントローラーにプロパティを作成する)。
var lastSearchedUserActivity: NSUserActivity?
ユーザーが何かを検索すると、最後のクエリがデバイス上でインデックス化されるという考え方です。ユーザーアクティビティを準備し、(おそらく)インデックスを作成する次のメソッドがあります。
func prepareLastSearchedUserActivity(tags: [String], server: Server) {
if Settings.applicationIndexedUserActivitiesAsShortcutTypes.contains(.LastSearched) {
print("Get ready to index. and tags \(tags.reduce("") { "\($0) \($1)" })")
let activity = NSUserActivity(activityType: ShortcutType.LastSearched.rawValue)
activity.title = server.serverName
activity.userInfo = ["tags": tags, "server name": server.serverName]
let attributeSet = CSSearchableItemAttributeSet()
attributeSet.contentDescription = tags.reduce("") { "\($0) \($1)" }
attributeSet.relatedUniqueIdentifier = ShortcutType.LastSearched.rawValue
activity.contentAttributeSet = attributeSet
activity.keywords = Set(tags)
activity.eligibleForSearch = true
activity.eligibleForHandoff = false
activity.becomeCurrent()
self.lastSearchedUserActivity = activity
//self.lastSearchedUserActivity?.becomeCurrent()
}
}
このメソッドは問題なく呼び出されますが、アクティビティは検索できません。title
割り当てられた を使用して Spotlight で検索しようとしましたが、keywords
. アクティビティは表示されません。
次のような多くのソリューションを試しました。
eligibleForSearch
アクティビティを作成した直後に呼び出しを移動するには。Apple のガイドはこれについて直接何も述べていませんが、提供されたリンクのコード スニペットは、この行を に設定するtrue
とアクティビティがインデックスに自動的に追加されることを暗示しているようです。Apple はそれが呼び出されるべきだとは言っていません
becomeCurrent()
が、むしろあなたのために呼び出されると言っています (どのように? わかりません)。どう見ても自分で呼んでみました。また、プロパティに割り当てた後に呼び出してみました。サイコロはありません。Apple は、 asbecomeCurrent()
を持つアクティビティを呼び出すと、それがインデックスに追加されると言っています。eligibleForSearch
true
userActivity
アクティビティの作成と構成のために、View Controller のプロパティを直接使用するところまで行きました。提供されたプロパティを使用しているため、早期に割り当てを解除するべきではありません。
私が知る限り、私は Apple がガイドで行っているすべてのことを行っています。私は完全に迷っています。
私は iPhone 6S+ でテストしているので、Spotlight インデックスを利用できます。コンソールには、Spotlight に関連するものも出力されません。
アップデート:
アクティビティのデリゲートを設定してself
、メソッドを実装しましたuserActivityWillSave
。
NSUserActivityDelegate
ドキュメントによると、約userActivityWillSave:
ユーザー アクティビティが保存され、継続または永続化されることをデリゲートに通知します。
したがって、このデリゲート メソッドが呼び出されますが、インデックス付きのアイテムはどこにも見つかりません。更新されたコードは次のとおりです。
func prepareLastSearchedUserActivity(tags: [String], server: Server) {
if Settings.applicationIndexedUserActivitiesAsShortcutTypes.contains(.LastSearched) {
print("Get ready to index. and tags \(tags.reduce("") { "\($0) \($1)" })")
let activity = NSUserActivity(activityType: ShortcutType.LastSearched.rawValue)
activity.title = server.serverName
activity.userInfo = ["tags": tags, "server name": server.serverName]
activity.delegate = self
let attributeSet = CSSearchableItemAttributeSet()
attributeSet.contentDescription = tags.reduce("") { "\($0) \($1)" }
attributeSet.relatedUniqueIdentifier = ShortcutType.LastSearched.rawValue
activity.contentAttributeSet = attributeSet
activity.keywords = Set(tags)
activity.eligibleForSearch = true
activity.eligibleForHandoff = false
self.lastSearchedUserActivity = activity
activity.becomeCurrent()
//self.lastSearchedUserActivity?.becomeCurrent()
}
}
func userActivityWillSave(userActivity: NSUserActivity) {
print("Yep it will save")
}