Share
Embed
App Intents再入門
HAKATA.swift feat. Japan-\(region).swift #1
https://hakata-swift.connpass.com/event/353191/
野瀬田 裕樹
July 19, 2025
Transcript
33 slides
-
"QQ*OUFOUTͷ࣮ w "QQ*OUFOUϓϩτίϧͰඞཁͳΛ࣮͢Δ͚ͩ protocol AppIntent : … { associatedtype PerformResult
: IntentResult static var title: LocalizedStringResource { get } static var openAppWhenRun: Bool { get } static var supportedModes: IntentModes { get } static var authenticationPolicy: IntentAuthenticationPolicy { get } static var isDiscoverable: Bool { get } associatedtype SummaryContent : ParameterSummary static var parameterSummary: Self.SummaryContent { get } static var description: IntentDescription? { get } func perform() async throws -> Self.PerformResult -
"QQ*OUFOUͷϓϩύςΟ !BWBJMBCMF NBD04J04XBUDI04UW04WJTJPO04 EFQSFDBUFE TUBUJDWBSPQFO"QQ8IFO3VO#PPM !BWBJMBCMF NBD04 J04 XBUDI04
UW04 TUBUJDWBSTVQQPSUFE.PEFT*OUFOU.PEFT\HFU^ ɾ"QQ*OUFOUTͷ࣮ߦ࣌ʹΞϓϦΛىಈ͢Δඞཁ͕͋Δ͔Ͳ͏͔ w 04͔ΒΑΓࡉ͔͘ىಈΛ੍ޚͰ͖ΔΑ͏ʹͳͬͨ -
"QQ*OUFOUͷϓϩύςΟ !BWBJMBCMF NBD04 J04 XBUDI04 UW04 TUBUJDWBSJT%JTDPWFSBCMF#PPM w
4IPSUDVUTͳͲͷγεςϜͷػೳ͕"QQ*OUFOUTΛݟ͚ͭΒΕΔ ͔Ͳ͏͔ w GBMTFʹ͢ΔͱΞϓϦͷϘλϯ8JEHFUͷϘλϯͷΑ͏ʹ໌ࣔ తͳ"QQ*OUFOUTݺͼग़͔͠͠Ͱ͖ͳ͘ͳΔ -
"QQ*OUFOUTͷ࣮ྫ struct SampleAppIntent: AppIntent { static let title: LocalizedStringResource =
“ShortcutsΞϓϦͳͲͰλΠτϧͱͯ͠දࣔ͞ΕΔ" @Parameter(title: "ςετ༻ύϥϝʔλ", description: "దͳจࣈྻΛೖྗ") var text: String static var parameterSummary: some ParameterSummary { Summary("\(\.$text) ͕App Intentsʹ͞Ε·͢") } static var description: IntentDescription? { .init("આ໌༻ςΩετ", categoryName: "ΧςΰϦ໊", searchKeywords: ["ݕࡧ༻Ωʔϫʔυ"]) } @MainActor func perform() async throws -> some IntentResult { print("\(text) ͕͞Ε·ͨ͠") return .result() } } -
"QQ*OUFOUTͷ࣮ྫ struct SampleAppIntent: AppIntent { static let title: LocalizedStringResource =
“ShortcutsΞϓϦͳͲͰλΠτϧͱͯ͠දࣔ͞ΕΔ" @Parameter(title: "ςετ༻ύϥϝʔλ", description: "దͳจࣈྻΛೖྗ") var text: String static var parameterSummary: some ParameterSummary { Summary("\(\.$text) ͕App Intentsʹ͞Ε·͢") } static var description: IntentDescription? { .init("આ໌༻ςΩετ", categoryName: "ΧςΰϦ໊", searchKeywords: ["ݕࡧ༻Ωʔϫʔυ"]) } @MainActor func perform() async throws -> some IntentResult { print("\(text) ͕͞Ε·ͨ͠") return .result() } } -
࠷ۙͷΞοϓσʔτ ݄ w 4OJQQFU*OUFOUͷՃ ˠը໘্ʹ4OJQQFUͱ͍͏ܗͰදࣔՄೳʹͳͬͨ w *OEFYFE"QQ&OUJUZͷՃ ˠ4QPUMJHIUͷΠϯσοΫε͕؆୯ʹͳͬͨ w *OUFOU7BMVF2VFSZ
ˠ7JTVBM*OUFMMJHFODF౷߹ͷͨΊʹγεςϜ"QQ&OUJUZఏڙΛߦ͑ΔΑ͏ʹͳͬͨ w "QQ&OUJUZͷ/46TFS"DUJWJUZͷؔ࿈͚͕Մೳʹ ˠը໘্ͷίϯςϯπΛ4JSJ͔Βར༻͢Δࡍʹ"TTJTUBOU4DFNB͕ෆཁʹͳͬͨ -
"QQ*OUFOUT1BDLBHFͷ࣮ํ๏ // ΞϓϦWidgetͷTargetͰ͜ͷΑ͏ͳstructΛ༻ҙ͢Δͱɺ // FrameworkͷApp Intents͕औΓࠐ·ΕΔ struct SampleAppIntentsPackage: AppIntentsPackage {
static var includedPackages: [any AppIntentsPackage.Type] { [SampleFrameworkAppIntentsPackage.self] } } // ΞϓϦWidgetͳͲ͔Βར༻͞ΕΔFrameworkͱͯ͠ͷTargetͰ // ͜ΕͱAppIntentʹద߹ͨ͠structΛ࣮͢Δ // *OS26Ҏ্Ͱ͋ΕSwift PackageͰͷఆٛʹରԠ public struct SampleFrameworkAppIntentsPackage: AppIntentsPackage {} -
"QQ4IPSUDVUT1SPWJEFSͷ࣮ํ๏ // SiriͷϑϨʔζͱ͔ΞϓϦWidgetͷTargetͰ͜ͷΑ͏ͳstructΛ༻ҙ͢Δͱɺ // FrameworkͷApp Intents͕औΓࠐ·ΕΔ nonisolated struct SampleAppShortcutsProvider: AppShortcutsProvider
{ @AppShortcutsBuilder static var appShortcuts: [AppShortcut] { AppShortcut( intent: SampleAppIntent(), phrases: [“\(.applicationName)ͰAppIntentΛ࣮ߦ͢Δ”], shortTitle: “γϣʔτΧοτΞϓϦͰλΠτϧͱͯ͠දࣔ͞ΕΔ”, systemImageName: “swift”, ) } }