NSUserActivity и глубокая ссылка Core Spotlight

Я использую как NSUserActivity, так и Core Spotlight для индексации контента в своем приложении. Причина, по которой я использую Core Spotlight, заключается в том, что я хочу проиндексировать этот контент до того, как пользователь получит к нему доступ (откроет).

Проблема, с которой я столкнулся, заключается в методе AppDelegate: func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool

В основном userActivity ТОЛЬКО содержит правильную информацию, когда я делаю это в своем viewController:

userActivity = myUserActivity

Но это не сработает, если я сделаю:

CSSearchableIndex.default().indexSearchableItems(searchableItems).

Используя второй метод (Core Spotlight), я могу видеть все свои результаты в поиске Spotlight, но когда я касаюсь элемента, у меня нет никакой информации в методе AppDelegate.

Хуже всего вот это:

po userActivity.activityType "com.apple.corespotlightitem"

Если я напечатаю тип активности, вместо того, чтобы получить свой собственный, я получу этот...

Какие-либо предложения?


person Victor    schedule 24.07.2018    source источник
comment
Из вашего вопроса непонятно, что вы ожидаете увидеть. В любом случае, если при вызове indexSearchableItems задать для searchableItem.identifier какое-либо уникальное значение, вы сможете получить это значение позже из userActivity.userInfo?[kCSSearchableItemActivityIdentifier]. Тип действия com.apple.corespotlightitem правильный и соответствует ожидаемому.   -  person Dale    schedule 24.07.2018


Ответы (1)


Когда ваше приложение запускается из результата CoreSpotlight, вы получаете CSSearchableItemActionType.

Вам нужно обработать этот тип действия, получив CSSearchableItemActivityIdentifier — это значение будет соответствовать идентификатору, который вы указали для своего доступного для поиска элемента, когда вы отправили его в индекс.

Что-то типа:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    if userActivity.activityType == CSSearchableItemActionType {
        guard let selectedItem = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String else {
            return
        }
        // Do something with selectedItem
    }
}
person Paulw11    schedule 24.07.2018
comment
О боже, эта пирамида судьбы. Используйте оператор запятой, необязательную цепочку и Optional.map/Optional.flatMap! - person Alexander; 24.07.2018
comment
Вот оно! Я не понял этого должным образом и одинаково относился как к Core Spotlight, так и к userActivity. Благодарю вас! - person Victor; 28.07.2018