【问题标题】:Siri Shortcut with NSUserActivity - activity deletion not working带有 NSUserActivity 的 Siri 快捷方式 - 活动删除不起作用
【发布时间】:2018-12-01 05:39:38
【问题描述】:

我正在使用 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 字典,在我的情况下,这使得快捷方式根本不显示,所以我改用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 参数,并且两次都得到了正确的值。

是我做错了什么还是我遗漏了什么?

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

【问题讨论】:

    标签: ios objective-c corespotlight nsuseractivity sirishortcuts


    【解决方案1】:

    我知道我错过了什么。我需要创建一个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) {}];
    

    【讨论】:

    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2020-03-24
    • 2019-03-26
    • 2019-04-29
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多