根据 AppIntent 中参数的选择显示 AppEntity 结果

Display AppEntity results depending on the selection of a Parameter in AppIntent

提问人:optz 提问时间:7/24/2023 更新时间:7/25/2023 访问量:421

问:

对于即将到来的 iOS 17,我正在从 SiriKit Intents 过渡到 AppIntents,并希望恢复与当前 IntentHandler 相同的逻辑。

根据 AppIntent 上第一个参数的选择,应用会为第二个参数创建选项列表。 例如:在第一个参数上选择一个国家/地区后,我只想在第二个参数上显示位于该国家/地区的城市(而不是所有国家/地区的所有城市)。

我找不到将 country 变量传递给我的 CityEntityQuery 的方法。

可悲的是,更改 AppIntent 的参数是不可能的,因为它无法从 iOS 16 迁移到 iOS 17。

意向的片段:

struct MyIntent: AppIntent, WidgetConfigurationIntent, CustomIntentMigratedAppIntent {
    static let intentClassName = "MyIntent"

    static var title: LocalizedStringResource = "Do Something"
    static var description = IntentDescription("Description of Do Something")

    
    @Parameter(title: "Country")
    var country: CountryAppEntity?

    @Parameter(title: "City")
    var city: CityAppEntity?
}

我的 CityAppEntity ,我想在其中访问在父意向中选择的国家/地区

struct CityAppEntity: AppEntity {
    static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "City")

    struct CityAppEntityQuery: EntityQuery {
        //I'd like to pass the selected country from the intent here somehow
        var countryAppEntity: CountryAppEntity?
        
        func entities(for identifiers: [CityAppEntity.ID]) async throws -> [CityAppEntity] {
            return await retrieveCities(country: countryAppEntity).filter { identifiers.contains($0.id) }
        }

        func suggestedEntities() async throws -> [CityAppEntity] {
            return await retrieveCities(country: countryAppEntity)
        }
        
        func retrieveCities(country: CountryAppEntity?) async -> [CityAppEntity] {
            //retrieve city based on country
            //...
        }
    }
    static var defaultQuery = CityEntityQuery()
    

    var id: String // if your identifier is not a String, conform the entity to EntityIdentifierConvertible.
    var displayString: String
    var displayRepresentation: DisplayRepresentation {
        DisplayRepresentation(title: "\(displayString)")
    }

    init(id: String, displayString: String) {
        self.id = id
        self.displayString = displayString
    }
}
Swift WidgetKit Sirikit Appintents ioS17

评论


答:

3赞 optz 7/25/2023 #1

找到了解决方案,我会在这里为那些有同样问题的人发布。

@IntentParameterDependency是将 intent 传递到 AppEntity 的键:

    struct CityAppEntityQuery: EntityQuery {
        //get the intent and requested property
        @IntentParameterDependency<MyIntent>(
            \.$country
        )
        var intent
        
        //code.....
    }