首页 > 解决方案 > iOS Siri Intents 扩展“我没有看到这样的应用程序。你需要下载一个。”

问题描述

我正在编写一个 Swift 框架,其中包含一个 Siri 意图定义文件和代码,该文件和代码既可用于主应用程序,也可用于 Today 扩展和 Siri 意图扩展。我正在使用 Cocoapods 分发框架(它在一个私人仓库中,所以我不能共享框架本身)。这适用于在应用程序和 Today 扩展中编译、链接和执行代码。

当用户执行相应的操作时,应用程序(或 Today 扩展程序)成功地捐赠了意图。然后我可以转到系统设置/Siri/建议的快捷方式并记录“个性化短语”来触发意图。

当我使用录制的短语调用 Siri 时,她回答说“我没有看到适用于此的应用程序。你需要下载一个。”

捐赠意图时,我还注意到以下错误消息:

[Intents] -[INIntentResponse init] App proxy < com.company.appID file:///Users/username/Library/Developer/CoreSimulator/Devices/.../data/Containers/Bundle/Application/.../AppName .app :0>> 不包含意图 nameOfIntent,回退到当前包

相同的代码运行良好,直到我将它移到框架中,所以我知道代码是正确的。

标签: cocoapodssirikit

解决方案


显然,捐赠的意图中包含的信息不足以让 com.apple.notificationcenterui 能够解析正确的应用程序来响应意图,这让我感到莫名其妙。为了让系统成功找到应用程序,intentdefinition 文件必须包含在应用程序的主包中。如果您不使用 Cocoapods,只需选中一个框以在应用程序包中包含 intentdefinition 文件,正如 Apple 在其Siri Shortcuts WWDC 视频简介中所推荐的那样。

在使用 Cocoapods 时,这是有问题的,因为框架和意图定义文件位于工作区中的单独项目中,因此您不能只选中一个框以将文件包含在应用程序的包中。

为了在使用 Cocoapods 时解决这个问题,我在我的应用程序的 podfile 中添加了以下内容:

post_install do |installer|
  require 'fileutils'
  # Copy Siri intentdefinition file from framework to app's resource folder, then use "Copy Bundle Resources" phase to copy it into app's main bundle
  FileUtils.cp_r('Pods/FrameworkName/FrameworkName/Base.lproj/Intents.intentdefinition', 'Resources/Intents.intentdefinition', :remove_destination => true)
end
  1. pod install
  2. 导航到您的应用目标的“构建阶段”/“复制捆绑资源”
  3. 单击列表底部的“+”按钮
  4. 单击提示底部的“添加其他...”
  5. 导航到您应用的“资源”文件夹
  6. 选择 Intent.intentdefinition 文件,该文件应该已经在步骤 #1 的文件夹中

现在,每次你pod installpod update时,它都会自动将最新的意图定义放在编译器可以将其包含在应用程序包中的位置,并且 Siri 很高兴。


推荐阅读