带有 NSUserActivity 的 Siri 快捷方式 - activity 删除不起作用

Siri Shortcut with NSUserActivity - activity deletion not working

我正在使用 NSUserActivityCoreSpotlight API 以及 WWDC Introduction to Siri Shortcuts and Building for Voice with Siri Shortcuts 视频中的 NSUserActivity 示例代码部分,但我在删除时遇到问题我的用户删除相应数据后的活动。我的应用程序是一个读书应用程序,用户可以在其中下载和阅读书籍,所以我想为用户下载的每本书提供快捷方式,但删除快捷方式when/if 他们删除了这本书。

我这里有定义 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 字典,在我的例子中,这使得快捷方式根本不显示,所以我使用 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) {}];

而且这些解决方案都没有奏效。在这两种情况下,我都检查了传递给函数的 productID 参数,并且两次都是正确的值。

我做错了什么或遗漏了什么吗?

提前感谢大家的帮助。这是我的第一个 post,如果我需要提供更多信息,请告诉我。

我想通了我错过了什么。我需要创建一个 CSSearchableItem,将其 uniqueIdentifierdomainIdentifier 属性设置为等于 NSUserActivity 的属性。然后我需要索引 CSSearchableItem.

这是我遗漏的代码:

attributes.relatedUniqueIdentifier = productID

CSSearchableItem *item = [[[CSSearchableItem alloc] init] autorelease];
item.uniqueIdentifier = productID;
item.domainIdentifier = productID;
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems: @[item] completionHandler: ^(NSError * _Nullable error) {}];