5

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()を持つアクティビティを呼び出すと、それがインデックスに追加されると言っています。eligibleForSearchtrue

  • 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")
}
4

1 に答える 1

6

relatedUniqueIdentifier属性セットで を設定すると、userInfoディクショナリが破棄されることが判明しました。

この行をコメントアウトしました:

attributeSet.relatedUniqueIdentifier = ShortcutType.LastSearched.rawValue

そして、現在は期待どおりに機能しています。ただし、ユーザー アクティビティをインデックスから削除する別の方法を見つける必要があります。

更新: 詳細情報

アクティビティに一意の識別子を使用する必要がある場合は、最初に Core Spotlight でインデックスを作成してから、それ自体をインデックスに登録する必要がありますNSUserActivityrelatedUniqueIdentifier最初に Spotlight で使用せずに を使用しようとすると、NSUserActivityはインデックス化されません。これが私の場合の問題でした。

Class ReferenceのrelatedUniqueIdentifierプロパティ ドキュメントCSSearchableItemAttributeSetから:

NSUserActivity API と Core Spotlight API の両方を使用して同じアイテムのインデックスを作成している場合は、アクティビティでこのプロパティを設定して、アクティビティが関連付けられている Core Spotlight アイテムの一意の識別子を指定し、Spotlight で重複した結果が表示されないようにします。

アクティビティが関連付けられている一意の識別子がまだ Core Spotlight でインデックス付けされていない場合、アクティビティはインデックス付けされません。

于 2016-01-31T01:36:07.927 に答える