我正在编写一个 Swift 框架,其中包含一个 Siri 意图定义文件和代码,这些文件和代码在主应用程序、Today 扩展和 Siri 意图扩展中使用。我正在使用 Cocoapods 分发框架(它位于私有仓库中,因此我无法共享框架本身)。这适用于从应用程序和 Today 扩展中编译、链接和执行代码。
当用户执行相应的操作时,应用程序(或 Today 扩展程序)成功地捐赠了意图。然后我可以转到系统设置/Siri/建议的快捷方式并记录“个性化短语”以触发意图。
当我使用录制的短语调用 Siri 时,她回答说“我没有看到与之相关的应用程序。你需要下载一个。”
捐赠意图时,我还注意到以下错误消息:
[Intents] -[INIntentResponse init] App 代理 < com.company.appID file:///Users/username/Library/Developer/CoreSimulator/Devices/.../data/Containers/Bundle/Application/.../AppName .app :0>> 不包含意图 nameOfIntent,回退到当前包
相同的代码运行良好,直到我将它移到框架中,所以我知道代码是正确的。
显然,捐赠的意图中包含的信息不足以让 com.apple.notificationcenterui 能够解析正确的应用程序来响应意图,我觉得这令人困惑。为了让系统成功找到应用程序,intentdefinition 文件必须包含在应用程序的主包中。如果您不使用 Cocoapods,只需选中一个框以在应用程序包中包含 intentdefinition 文件,正如 Apple 在他们的Siri Shortcuts WWDC 视频简介中所推荐的那样。
使用 Cocoapods 时,这是有问题的,因为框架和 intentdefinition 文件位于工作区中的单独项目中,因此您不能只选中一个框以将文件包含在应用程序包中。
为了在使用 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
Run Code Online (Sandbox Code Playgroud)
pod install现在,每次您pod install或 时pod update,它都会自动将最新的意图定义放在编译器可以将其包含在应用程序包中的位置,Siri 很高兴。
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |