具有NSUserActivity的Siri快捷方式-活动删除不起作用

时间:2018-06-21 19:23:04

标签: ios objective-c corespotlight nsuseractivity sirishortcuts

我正在使用NSUserActivityCoreSpotlight API,并紧跟WWDC Introduction to Siri ShortcutsBuilding for Voice with Siri Shortcuts视频中的NSUserActivity示例代码节,但我我的用户删除相应的数据后,在删除活动时会遇到问题。我的应用程序是一个读书应用程序,用户可以在其中下载和阅读书籍,所以我想为用户下载的每本书都提供快捷方式,但是当/如果他们删除了该书,请删除该快捷方式。

我这里有定义NSUserActivity及其相关属性的代码:

self.activity = [[[NSUserActivity alloc] initWithActivityType: @"Read a book"] autorelease];
self.activity.eligibleForSearch = true;
self.activity.eligibleForHandoff = true;
self.activity.eligibleForPublicIndexing = true;
self.activity.userInfo = @{ @"productID" : productID };
self.activity.requiredUserInfoKeys = [NSSet setWithArray: @[@"productID"]];
if (@available(iOS 12.0, *))
{
    self.activity.eligibleForPrediction = true;
    self.activity.suggestedInvocationPhrase = @"Read";
    self.activity.persistentIdentifier = NSUserActivityPersistentIdentifier(productID);
}

我还具有定义CSSearchableItemAttributeSet及其相关属性,将其连接到NSUserActivity并将其激活的代码:

CSSearchableItemAttributeSet *attributes = [[[CSSearchableItemAttributeSet alloc] initWithItemContentType: (NSString *)kUTTypeItem] autorelease];
attributes.title = bookTitle;
attributes.keywords = @[keywords];
attributes.contentDescription = author;
attributes.thumbnailData = [NSData dataWithContentsOfURL: self.bookCover];
attributes.domainIdentifier = productID;
self.activity.contentAttributeSet = attributes;
self.userActivity = self.activity;
[self.activity becomeCurrent];

我通过研究发现,使用attributes.relatedUniqueIdentifier摆脱了userInfo字典,在我的情况下,这使得快捷方式根本不显示,所以我正在使用{{1} }。

现在在另一个文件中,我删除快捷方式。我尝试使用使用attributes.domainIdentifier属性的代码:

self.activity.persistentIdentifier

我也尝试过使用使用if (@available(iOS 12.0, *)) { [NSUserActivity deleteSavedUserActivitiesWithPersistentIdentifiers: @[NSUserActivityPersistentIdentifier(productID)] completionHandler: ^{}]; } 属性的代码:

attributes.domainIdentifier

这些解决方案都不起作用。在这两种情况下,我都检查了传递到函数中的[[CSSearchableIndex defaultSearchableIndex] deleteSearchableItemsWithDomainIdentifiers: @[productID] completionHandler: ^(NSError * _Nullable error) {}]; 参数,并且两次都没有输入正确的值。

是我做错了什么还是缺少了什么?

在此先感谢大家的帮助。这是我的第一篇文章,如果需要提供更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

我弄清楚了我所缺少的。我需要创建一个GetDeletedNodesXml(),将其CSSearchableItemuniqueIdentifier属性设置为等于domainIdentifier的属性。然后我需要为NSUserActivity编制索引。

这是我所缺少的代码:

CSSearchableItem