siri快捷按钮(INUIAddVoiceShortcutButton)在有多个快捷方式时显示错误的标题(NSUserActivity)

Bil*_*lal 8 ios swift ios12 sirishortcuts

我的应用程序中有2个siri快捷方式.我使用NSUserActivity来捐赠这些快捷方式.我还在info.plist中创建了2个NSUserActivityTypes.

有2个视图控制器可以处理这些快捷方式(1个快捷方式的视图控制器).

如果我从1个视图控制器添加1个siri快捷方式,然后转到第2个视图控制器,第2个视图控制器上的原生siri快捷按钮(INUIAddVoiceShortcutButton)会自动选择第一个快捷方式(从第1个视图控制器创建)并显示"添加到Siri"并显示建议的短语而不是显示"添加到Siri"按钮.我仔细检查每个NSUserActivity都有不同的标识符,但仍然以某种方式选择了错误的快捷方式.

查看控制器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)
Run Code Online (Sandbox Code Playgroud)

查看控制器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)
Run Code Online (Sandbox Code Playgroud)

当我删除应用程序并重新安装而不删除Phone的设置应用程序中的快捷方式时,会发生类似的情况.

Bil*_*lal 3

看起来像是 IOS 的 bug。我想出了解决这个问题的方法。每次用户添加/编辑 siri 快捷方式时,您都必须创建一个新的 siri 按钮。在创建 Siri 按钮之前,请执行以下操作

INVoiceShortcutCenter1-通过调用该函数获取所有语音快捷方式。请注意,这是异步发生的,因此您需要在需要数据之前执行此操作(例如在 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
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

3-如果您的语音快捷方式已注册,则将其传递INShortcut给 siri 按钮,否则请勿设置。

if voiceShorcut != nil {
    let shortcut = INShortcut(userActivity: userActivity1)
    siriButton.shortcut = shortcut
} 
Run Code Online (Sandbox Code Playgroud)

在第二个视图控制器中执行相同的操作。