Siri 支持:INPlayMediaIntent 支持哪些意图参数?

Siri Support: What are supported intent parameters for INPlayMediaIntent?

我创建了一个 iOS 应用程序扩展,并在扩展的 plist IntentsSupported 数组中定义了一个条目 INPlayMediaIntent。一切都很好。 但是几天后(WWDC 2019)我无法将应用程序提交到 TestFlight/App Store Connect。

我按照 Apple 的说明修复了这些错误:

现在我试图在 AppIntentVocabulary.plist 此处提供一个意图参数:

<dict>
    <key>ParameterVocabularies</key>
    <array>
        <dict>
            <key>ParameterNames</key>
            <array>
                <string>INPlayMediaIntent.mediaItems</string>
            </array>

我尝试了各种字符串,根据这些 App Store 电子邮件,所有字符串都是错误的:

INPlayMediaIntent的有效参数名称是什么?

它可以如此简单,因为 Apple 在这里有一个 INPlayMediaIntent 的示例项目,我曾经为我的项目学习过它:

https://developer.apple.com/documentation/sirikit/media/playing_media_through_siri_shortcuts

但是:这个项目似乎不是最新的,因为它缺少最近似乎需要的 AppIntentVocabulary.plist。

我联系了 Apple 的开发者支持并得到了这个答案:

“您应该能够将您的应用程序提交到 AppstoreConnect 而不会看到这些警告。请提交有关此问题的完整错误报告……”

我还原了试图修复初始错误消息的更改,而我当前的构建不再收到警告。

以这种方式处理意图:

- (void)application:(UIApplication *)application handleIntent:(INIntent *)intent completionHandler:(void (^)(INIntentResponse * _Nonnull))completionHandler {
        INPlayMediaIntent *mediaIntent = (INPlayMediaIntent *)intent;
        INMediaItem *mediaItem = [mediaIntent.mediaItems firstObject];
        NSString *myId = mediaItem.identifier;
        INMediaItemType mediaType = mediaItem.type;
// play some media identified by myId and mediaType
        INPlayMediaIntentResponse *response = [[INPlayMediaIntentResponse alloc] initWithCode:INPlayMediaIntentResponseCodeSuccess userActivity:nil];
        completionHandler(response);
}

我想回答实际问题,因为文档在这方面具有误导性。如果它是正确的,那么只允许“来自意图 class 的 属性 名称的关键路径 [s]”,这对 INPlayMediaIntents 没有任何意义。为了找到正确的答案,我看了 Design high quality Siri media interactions 和 12:20,我们可以看到一张幻灯片,其中包含从用户词汇符号(强类型)到要在 [=27 中使用的字符串的映射=].

检查某个键是否受支持的一般思路是转到 INVocabularyStringType 并检查以相应 Siri 域(在本例中为 media<SomeThing>)开头的键,然后使用 INPlayMediaIntent.someThing 用于 plist 中的 ParameterNames 数组。

Managing Audio with SiriKit 示例代码中,我们可以看到使用 INPlayMediaIntent.playlistTitle 的示例。