Сочетание клавиш siri (INUIAddVoiceShortcutButton) показывает неправильный заголовок, если имеется несколько ярлыков (NSUserActivity) - PullRequest
0 голосов
/ 15 сентября 2018

В моем приложении 2 ярлыка siri. Я использую NSUserActivity, чтобы пожертвовать эти ярлыки. Я также создал 2 NSUserActivityTypes в моем info.plist.

Существует 2 контроллера вида, которые обрабатывают эти ярлыки (1 контроллер вида на 1 ярлык).

Если я добавлю 1 ярлык siri из контроллера 1 представления, а затем перейду ко 2-му контроллеру вида, то нативная кнопка быстрого доступа siri (INUIAddVoiceShortcutButton) на контроллере 2-го вида автоматически выберет первый ярлык (созданный из контроллера 1-го вида) и покажет «Добавлено к Siri "с предложенной фразой вместо отображения кнопки" Добавить к Siri ". Я дважды проверил, что у каждого NSUserActivity свой идентификатор, но все равно он выбирает неправильный ярлык.

View Controller 1:

let userActivity = NSUserActivity(activityType: "com.activity.type1")
userActivity.isEligibleForSearch = true
userActivity.isEligibleForPrediction = true
userActivity.title = shortcut.title
userActivity.suggestedInvocationPhrase = suggestedPhrase

let attributes = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
attributes.contentDescription = description
userActivity.contentAttributeSet = attributes
let shortcut = INShortcut(userActivity: userActivity)
let siriButton = INUIAddVoiceShortcutButton(style: .whiteOutline)
siriButton.translatesAutoresizingMaskIntoConstraints = false
siriButton.shortcut = shortcut
self.view.addSubview(siriButton)

Просмотр контроллера 2:

let userActivity2 = NSUserActivity(activityType: "com.activity.type2")
userActivity2.isEligibleForSearch = true
userActivity2.isEligibleForPrediction = true
userActivity2.title = shortcut.title
userActivity2.suggestedInvocationPhrase = suggestedPhrase

let attributes = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
attributes.contentDescription = description
userActivity2.contentAttributeSet = attributes

let shortcut = INShortcut(userActivity: userActivity2)
let siriButton = INUIAddVoiceShortcutButton(style: .whiteOutline)
siriButton.translatesAutoresizingMaskIntoConstraints = false
siriButton.shortcut = shortcut
self.view.addSubview(siriButton)

Подобное происходит, когда я удаляю приложение и переустанавливаю его, не удаляя ярлыки из приложения настроек телефона.

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Я перешел к настройке намерений сейчас и обнаружил, что даже при установке только одного намерения и работе INUIAddVoiceShortcutButton не удается отследить мой ярлык.Как только фраза записана, на ней отображается «Добавлено в Siri» с фразой.

Но каждый раз, когда приложение перезапускается, кнопка «Добавить в Siri» появляется вместо кнопки «Добавлено в Siri» с записанной фразой.

IЯ попытался воспользоваться предложением Билала, и хотя я вижу, что INVoiceShortcutCenter показывает мой ярлык в подарок, он не загружает его в кнопку Siri.

Мой код выглядит так для самой кнопки.

 private func addSiriButton() {
    let addShortcutButton = INUIAddVoiceShortcutButton(style: .blackOutline)
    addShortcutButton.delegate = self

    addShortcutButton.shortcut = INShortcut(intent: engine.intent )
    addShortcutButton.translatesAutoresizingMaskIntoConstraints = false

    siriButtonSubView.addSubview(addShortcutButton)
    siriButtonSubView.centerXAnchor.constraint(equalTo: addShortcutButton.centerXAnchor).isActive = true
    siriButtonSubView.centerYAnchor.constraint(equalTo: addShortcutButton.centerYAnchor).isActive = true

}

У меня есть все реализованные протоколы, и я внимательно посмотрел на приложение Soup, но просто не могу понять, что является причиной этой неточности.

Довольно забавно, даже приложение British Airwaysразработчики отказались от этого, поскольку их кнопка имеет точно такое же поведение ошибки.

Обновление : я создал еще один тестовый проект с минимальной реализацией для Intent и Add to Siri иДобавлено в Сири работает отлично.Я предполагаю, что в моей собственной базе приложений есть что-то, что вызывает это нежелательное поведение.

update 2 Просто хотел, чтобы все знали, что я исправил проблему.Использование намерений работает нормально, но в самом файле определения содержания определенно есть небольшая чувствительность.Все, что мне нужно было сделать, это создать новое намерение, которое затем было сгенерировано, и это сработало.Кажется, мое первоначальное намерение было как-то повреждено, но ошибок не было.После создания другого намерения и переназначения функции обработки намерений все это заработало как задумано.(каламбур)

0 голосов
/ 15 сентября 2018

Я только что сам исправил эту проблему, изменив мою реализацию (изначально основанную на приложении souchechef) на этот пример кода, предоставленный Apple (https://developer.apple.com/documentation/sirikit/inuiaddvoiceshortcutbutton):

РЕДАКТИРОВАТЬ: я добавил код, который показывает, как ясоздайте и передайте в shortcutObject (INShortcut) как UserActivity, так и пользовательские ярлыки Intent.

Класс Shortcut представляет собой перечисление, которое содержит вычисляемое свойство с именем intent, которое возвращает экземпляр пользовательского намерения.

private func addShortcutButton(shortcut: Shortcut, parentViewController: UIViewController, shortcutViewControllerDelegate: INUIAddVoiceShortcutViewControllerDelegate) {
    guard let view = parentViewController.view else { return }

    if let intent = shortcut.intent {
        shortcutObject = INShortcut(intent: intent)
    } else if let userActivity = view.userActivity {
        shortcutObject = INShortcut(userActivity: userActivity)
    }

    self.shortcutViewControllerDelegate = shortcutViewControllerDelegate
    addSiriButton(to: shortcutButtonContainer)
}

func addSiriButton(to view: UIView) {
    let button = INUIAddVoiceShortcutButton(style: .whiteOutline)
    button.translatesAutoresizingMaskIntoConstraints = false

    view.addSubview(button)
    view.centerXAnchor.constraint(equalTo: button.centerXAnchor).isActive = true
    view.centerYAnchor.constraint(equalTo: button.centerYAnchor).isActive = true

    button.addTarget(self, action: #selector(addToSiri(_:)), for: .touchUpInside)
}

// Present the Add Shortcut view controller after the
// user taps the "Add to Siri" button.
@objc
func addToSiri(_ sender: Any) {
    guard let shortcutObject = shortcutObject else { return }
    let viewController = INUIAddVoiceShortcutViewController(shortcut: shortcutObject)
    viewController.modalPresentationStyle = .formSheet
    viewController.delegate = shortcutViewControllerDelegate
    parentViewController?.present(viewController, animated: true, completion: nil)
}
0 голосов
/ 21 сентября 2018

Это ошибка iOS 12.0.Вы можете исправить это, обновив INUIAddVoiceShortcutButton.voiceShortcut с правильным значением.Используйте KVO для наблюдения за свойством voiceShortcut, и при его изменении присвойте ему правильное значение.

0 голосов
/ 15 сентября 2018

Похоже, это ошибка IOS.Я нашел обходной путь для этой проблемы.Вы должны создавать новую кнопку siri каждый раз, когда пользователь добавляет / редактирует ярлык siri.Перед созданием кнопки siri выполните следующие действия:

1 - Получите все голосовые сочетания клавиш из INVoiceShortcutCenter, вызвав функцию.Обратите внимание, что это происходит асинхронно, поэтому вам нужно сделать это некоторое время, прежде чем вам понадобятся данные (например, в вашем AppDelegate).Вам также нужно будет перезагружать его всякий раз, когда пользователь добавляет ярлык Siri (вероятно, в методе INUIAddVoiceShortcutViewControllerDelegate.addVoiceShortcutViewController(_:didFinishWith:error)).

INVoiceShortcutCenter.shared.getAllVoiceShortcuts  { (voiceShortcutsFromCenter, error) in
    guard let voiceShortcutsFromCenter = voiceShortcutsFromCenter else {
            if let error = error as NSError? {
                os_log("Failed to fetch voice shortcuts with error: %@", log: OSLog.default, type: .error, error)
            }
            return
        }
        self.voiceShortcuts = voiceShortcutsFromCenter
}

2 - В View Controller-1 проверьте, если ярлык уже добавленили нет, повторяя все голосовые ярлыки

let voiceShorcut = voiceShortcuts.first { (voiceShortcut) -> Bool in
    if let activity = voiceShortcut.shortcut.userActivity, activity.activityType == "com.activity.type1" {
        return true
    }
    return false
}

3- Если ваш голосовой ярлык зарегистрирован, тогда передайте кнопку INShortcut siri, в противном случае не устанавливайте ее.

if voiceShorcut != nil {
    let shortcut = INShortcut(userActivity: userActivity1)
    siriButton.shortcut = shortcut
} 

Сделайте то же самое в Second View Controller.

...