実際に使ってみる

TuneDice
この記事が良かったら
「チップをリクエスト」で著者にチップの受け取り設定をお願いできます

Swift + MusicKit for Swiftで作った、カラオケ用ランダム抽選アプリの開発記録
実際に使ってみる

TuneDice
この記事が良かったら
「チップをリクエスト」で著者にチップの受け取り設定をお願いできます
カラオケで次の曲を選ぶのに毎回時間がかかるのが地味にストレスだなーと思うことが多々ありました。Apple Musicにプレイリストは作ってあるのに、いざ順番が回ってくると選べず、結局いつもの数曲を選んでしまい面白みに欠ける。
それなら選ぶ作業自体をなくして、ランダムに1曲出すだけのアプリを作ればいいと思い、「TuneDice」というiOSアプリを作りました。先日App Storeに公開しています。
https://apps.apple.com/jp/app/tunedice/id6804372799
実際の再生や歌詞表示はやっていません。曲名を教えてくれるだけのシンプルなツールです。
最初のプロジェクト名は「KaraokeRandomPicker」でした。要件を詰めていくうちに、これはカラオケに限った話ではなく「プレイリストから何かひとつをランダムに選ぶ」だけの汎用機能だと気づき、途中で「TuneDice」にリネームしました。ストアには何も出していない段階だったので、Bundle IDやフォルダ名を含めて気兼ねなく変えられました。
Swift + SwiftUI + MusicKit for Swift、Xcodeプロジェクトの生成はXcodeGen(project.yml管理)という構成です。要件定義から実装まで、ほぼ全工程をClaude Codeと進めました。
CLAUDE.mdに「曲ソースはプレイリストかライブラリのどちらか」「歌った履歴とNGリストは別ライフサイクルで管理する」といった決定事項を書き溜めながら仕様を詰め、そこから逆算して実装を進めるやり方にしました。仕様の揺れを先にドキュメント側で潰しておくと、実装の手戻りは減りました。
MusicKit capabilityを付けたら実機ビルドできなくなりました。Swift向けMusicKit(import MusicKit、MusicAuthorization)は、Developer Portal側のApp ID capabilityやentitlementを必要としません。必要なのはNSAppleMusicUsageDescriptionと実行時のユーザー認可だけです。それを知らずにMusicKit capabilityを追加したところ、無効なentitlementのせいで自動署名が通らなくなりました。原因の切り分けたところ、外したら実機で普通に読めるようになりました。
一度拒否されると、二度と許可ダイアログは出ません。iOSの仕様上、ユーザーが一度パーミッションを拒否すると、そのアプリからはシステムの許可ダイアログを二度と出せません(どのアプリでも共通の制約です)。それを知らずに「もう一度試す」ボタンを付けていたら、拒否後は毎回黙って.deniedが返るだけでボタンが反応しないように見えるバグになっていました。MusicAuthorization.currentStatusで状態を見て、未確定ならシステムダイアログ、拒否・制限済みなら設定アプリを開くボタンに出し分け、設定アプリから戻ったタイミングで自動的に再チェックするようにして直しました。
NSAppleMusicUsageDescriptionの説明が薄いと指摘され、「何のためにアクセスするか」「再生や保存はしない」ことまで明記する文言に書き直したどれも機能追加ではなく、説明や導線の正確さを問われる指摘でした。
TuneDiceはApp Storeで公開中です。https://apps.apple.com/jp/app/tunedice/id6804372799
フィードバックいただけると嬉しいです。