🎤

SwiftUIでテキスト読み上げアプリを作った

2025/01/13に公開

メモ帳でも簡易的な単語帳にもなる

SwiftUIで保存したテキストを読み上げてくれるiOSアプリをリリースしました。ただのメモ帳だと面白くないのでテーマカラーの変更、ライトモード・ダークモードへの対応、リスト表示から横スワイプできるフラッシュカードを実装してみた。

https://apps.apple.com/jp/app/speechstorage/id6740153885

💡なぜこのアプリ作ろうと思ったのか?

以前からテキスト読み上げ機能に興味があってアプリ作ってみたいと思ったのがきっかけですね。横スワイプできるフラッシュカードのアプリも作りたくて思いつきでやってみました。アプリのテーマカラーも変更できた方がその日の気分で好みのカラーにしたいという欲求を満たせるのでつけてみました。今日は青がいい。今日は赤がいい。こんな感じで変更できる。

🔨技術構成

言語: Swift
FW: SwiftUI
ローカルデータベース: SwiftData
テキスト読み上げ機能: AVSpeechSynthesizer

Flutter/Reactという宣言的なUIで開発ができるフレームワーク・ライブラリに慣れている私には、使いやすかったSwiftUIを技術選定で選択しました。Swiftはプログラミングスクールで学習経験があるので少しわかる。iOSエンジニアに転職できなかったが😇

リモートのデータベースは使う必要がなかったので、端末にデータが保存できるSwiftDataを使用しました。使いやすくて学習コストが低い。

テキストの読み上げには、AVSpeechSynthesizerというiOS標準のモジュールを使用しました。

💦リリースで詰まった

最近は、プライバシーマニフェストに対応してないとリジェクトされるだけでなくバイナリファイルが無効ですとエラーになってしまうので対応が必要になりました。
Appleから送られてくるメールに対応しながらこれを追加するのか?
粘り強く続けてリリースしました😭

ローカルデータベースが使われていたら、UserDefaultsを記載するのは理解した。

https://developer.apple.com/documentation/bundleresources/privacy-manifest-files

xmlファイルで表示するとこんな感じですね。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSPrivacyAccessedAPIType</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>UserDefaults</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSMicrophoneUsageDescription</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>1C4.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSSpeechRecognitionUsageDescription</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>1C4.1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

最後に

このアプリは最初はFlutterで開発してたのですが、動画が不安定だったりなんか快適ではないなと思い、スムーズに動いて標準のモジュールが提供されているSwiftUIを使った方が開発はしやすいだろうと思い試してみたところテーマカラーの設定も理想に近い状態で実装できたので、こだわったアプリを作ろうとすると、SwiftUIでないと難しいと思いました。

Discussion