体調記録くん音声入力開発記録3

序文

WWDC2022の資料でやりたいことを完全に解説している動画を見つけ、開発記録1,2でやっていたことは古い方法でiOS16以降なら簡単に実現できることを知りました。
実装して動作確認をしていきます。

発覚

iOSの音声入力の実現方法を探していると「Implement App Shortcuts with App Intents」というタイトルの動画を見つけました。動画を見て関連資料を読んで新しい方法で簡単に実現できることがわかりました。
新しい情報だからChatGPTでは引っかからないものでした。そういえば情報が古いという話は聞いていたのに忘れてました。
念の為、本人に聞いてみました。

質問

最新の情報はいつ頃までの情報を学習しているのですか?

回答

私の知識は、2021年9月までの情報を学習しています。そのため、それ以降の情報や出来事については把握していません。最新の情報をお求めの場合は、他の情報源を参照してください。

実装方法

結論から言うとメタファイルを使わず全てSwiftコードとして記述するだけでインテントの追加からアプリインストール時のショートカットの作成、Siriで実行するためのパラメータを含む読み方の指定まで、諸々できてしまうと言うことでした。

実装

AppIntent

import AppIntents

struct RecordLatestConditionIntent: AppIntent {
    static let title: LocalizedStringResource = "Record Latest Condition"
    
    @Parameter(title: "Condition")
    var condition: ConditionEnum
    
    func perform() async throws -> some IntentResult & ProvidesDialog {
        let time = DayDataService.recordLatestCondition(condition)
        return .result(dialog: "Success Recording \(condition) at \(time) time")
    }
}

enum ConditionEnum: Int {
    case no_record = 0
    case poor = 1
    case average = 2
    case good = 3
    case very_good = 4
    case excellent = 5
}

extension ConditionEnum: AppEnum {
    static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Condition Enum")
    static var caseDisplayRepresentations: [ConditionEnum : DisplayRepresentation] {
        [
            .no_record: "no record",
            .poor: "poor",
            .average: "average",
            .good: "good",
            .very_good: "very good",
            .excellent: "excellent"
        ]
    }
}

AppShortcutsProvider

import AppIntents

struct ConditionRecorderShortcuts : AppShortcutsProvider {
    static var appShortcuts: [AppShortcut] {
        AppShortcut(
            intent: RecordLatestConditionIntent(),
            phrases: ["\(.applicationName)\(\.$condition)"]
        )
    }
}

動作確認

アプリをデプロイした時点でショートカットアプリにアプリが登録されていました。はじめはPhrasesでapplicationNameとconditionの間にスペースを入れてしまっていたため一致したと認識してもらえずはまってました。
設定 > Siriと検索 > Siriの応答で「話した内容を常に表示」を有効にすると動作確認時に無駄な試行が減ってよかったです。

無駄なスペースを削除してアプリの別名も「体調」で登録して「体調とても良い」で起動できる様になりました。
ただ実行が安定せず結構な割合で「すみません、何か問題が起きました。」となってしまいます。
この不具合をなんとかしないとリリースは難しそうです。


この記事が気に入ったらサポートをしてみませんか?