Siri не распознает параметр во фразеIOS

Программируем под IOS
Ответить
Anonymous
 Siri не распознает параметр во фразе

Сообщение Anonymous »

Я разрабатываю приложение для iOS с использованием платформы App Intents. Я создал OpenShowIntent, который должен позволять пользователям открывать шоу вне приложения:
вызвав ярлык и указав название шоу, или
спросив Siri : «Открыть [показать имя] в [имя приложения]»
Ярлык работает правильно, если его вызвать вручную через приложение «Ярлыки». Однако когда я пытаюсь использовать голосовую команду Siri, Siri распознает название приложения, но, похоже, не распознает название шоу. Siri загружается, но не завершает действие и возвращает сообщение «Что-то пошло не так». В чем здесь может быть проблема?

Код: Выделить всё

OpenShowIntent.swift:
import Foundation
import AppIntents
import Models

@available(iOS 16.0, *)
struct OpenShowIntent: AppIntent {
static var title: LocalizedStringResource = "Open a Show"
static var openAppWhenRun = true

@Parameter(title: "Show", optionsProvider: ShowEntityQuery())
var show: ShowEntity?

@Parameter(title: "Show Name")
var showName: String

static var parameterSummary: some ParameterSummary {
Summary("Open \(\.$showName) in (APP NAME)")
}

@MainActor
func perform() async throws -> some IntentResult & ProvidesDialog {

var showToOpen: ShowEntity

if let show = show {
showToOpen = show
} else {
let params = ElasticSearchParams(query: showName)
let searchResults = try await IntentsHelper.getShows(searchParams: params)
let entities = searchResults.map { show in
ShowEntity(id: show.id, name: show.displayName, posterUrl: show.posterImageUrl)
}
showToOpen = try await $show.requestDisambiguation(
among: entities,
dialog: "Choose a show from this list?"
)
}
let deepLink = DeepLink(
type: .show(
showId: showToOpen.id,
showDateStr: nil,
voucher: nil,
reviewModalParams: nil
)
)
let url = try deepLink.createURL(source: nil)
IntentsHelper.openLink(url: url)
return .result(dialog: "Show '\(showToOpen.name)' opened successfully.")
}
}

Код: Выделить всё

ShowEntity.swift:
import Foundation
import AppIntents
import Models

@available(iOS 16.0, *)
struct ShowEntity: AppEntity {
typealias DefaultQuery = ShowEntityQuery
var id: Int
var name: String
var posterUrl: URL?

static var typeDisplayRepresentation: TypeDisplayRepresentation = "Show"

var displayRepresentation: DisplayRepresentation {
var image: DisplayRepresentation.Image?
if let imageUrl = posterUrl {
image = DisplayRepresentation.Image(url: imageUrl)
}
return DisplayRepresentation(
title: LocalizedStringResource(stringLiteral: name),
subtitle: nil,
image: image
)

}
static var defaultQuery = ShowEntityQuery()
init(id: Int, name: String, posterUrl: URL?) {
self.id = id
self.name = name
self.posterUrl = posterUrl
}
}

Код: Выделить всё

ShowEntityQuery.swift:
import Foundation
import AppIntents
import Models

@available(iOS 16.0, *)
struct ShowEntityQuery: EntityStringQuery {
func entities(for identifiers: [Int]) async throws -> [ShowEntity] {
let params = ElasticSearchParams(showIds: identifiers)
let searchResult = try await IntentsHelper.getShows(searchParams: params)
return searchResult.map { show in
ShowEntity(id: show.id, name: show.displayName, posterUrl: show.posterImageUrl)
}
}

func suggestedEntities() async throws -> [ShowEntity] {
let params = ElasticSearchParams(
showIds: BookmarksManager.sharedManager.getBookmarkShowIdsAsArray()
)
let searchResult = try await IntentsHelper.getShows(searchParams: params)
return searchResult.map { show in
ShowEntity(id: show.id, name: show.displayName, posterUrl: show.posterImageUrl)
}
}

func entities(matching query: String) async throws ->  [ShowEntity] {
let params = ElasticSearchParams(query: query)
print("entities(matching:) called with query: \(query)")
let searchResult = try await IntentsHelper.getShows(searchParams: params)
return searchResult.map { show in
ShowEntity(id: show.id, name: show.displayName, posterUrl: show.posterImageUrl)
}
}
}

Код: Выделить всё

ShortcutsProvider.swift:
import Foundation
import AppIntents

@available(iOS 16.0, *)
struct TTShortcuts: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
return [
AppShortcut(
intent: OpenShowIntent(),
phrases: [
"View show in \(.applicationName)",
"Open \(\.$showName) in \(.applicationName)",
"Show \(\.$showName) in \(.applicationName)",
"Find \(\.$showName) in \(.applicationName)",
"Search for \(\.$showName) in \(.applicationName)"
],
shortTitle: "Open show",
systemImageName: "pencil.circle"
)
]
}
static var shortcutTileColor: ShortcutTileColor = .blue
}
Я хочу, чтобы пользователь активировал Siri и сказал: «Открой {showname} в {appName}», и Siri откроет шоу в приложении.

Подробнее здесь: https://stackoverflow.com/questions/787 ... the-phrase
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»