PDFKitでPDF表示・注釈機能を実装した流れで、以前から興味のあったMusicKitによるApple Music連携にも挑戦してみました。
1. Apple Musicのサブスクリプションが必須だと知らず戸惑った
最初、MusicKitのAPIさえ正しく呼び出せば、誰でも楽曲を再生できるものだと思い込んでいました。
let player = ApplicationMusicPlayer.shared
コード自体は問題なく動くのですが、実機で試すとサブスクリプションを契約していないアカウントでは楽曲の再生が始まりませんでした。調べてみると、フル再生にはApple Musicのサブスクリプションが必要で、契約のない場合はプレビュー再生など限定的な機能しか使えない仕組みになっていることが分かりました。
2. 権限リクエストと認証の違いを理解していなかった
音楽ライブラリへのアクセス権限をリクエストすれば、それだけでApple Musicの機能がすべて使えるようになると思い込んでいました。
let status = await MusicAuthorization.request()
このリクエストはあくまでユーザーのミュージックライブラリへのアクセス許可を求めるものであり、Apple Musicアカウントとしての認証やサブスクリプション状態の確認とは別の話だと分かりました。両方を意識して初めて、想定通りの機能提供ができるようになりました。
3. 楽曲検索の結果がアカウントの地域によって変わることに気づかなかった
検索APIで取得した楽曲IDを固定でアプリに埋め込んでいたところ、一部のユーザーから「その曲が見つからない」という報告を受けました。
気づいたこと:
Apple Musicのカタログはストアフロント(国・地域)ごとに異なる
Apple Musicのカタログはアカウントに紐づくストアフロント(国・地域)ごとに内容が異なり、ある地域で取得できた楽曲IDが別の地域では存在しない場合があると分かりました。楽曲IDを固定で埋め込むのではなく、実行時に検索して取得する設計に見直す必要がありました。
4. 再生状態の変化をポーリングで監視しようとして無駄が多かった
再生中かどうかをUIに反映するために、タイマーで定期的に再生状態をチェックするポーリング処理を書いていました。
for await state in player.state.playbackStatusUpdates {
}
ポーリングでも動作はするものの、無駄なチェックが多く電力効率もよくありませんでした。調べてみると、playbackStatusUpdatesのような非同期シーケンスを使って状態の変化を購読できることが分かり、ポーリングをやめて必要なタイミングだけ更新する実装に切り替えることができました。
まとめ
- フル再生にはユーザーのApple Musicサブスクリプションが必須で、契約がない場合は機能が制限される
- ミュージックライブラリへのアクセス権限リクエストと、Apple Musicの認証・サブスクリプション確認は別物として扱う必要がある
- 楽曲カタログはストアフロント(国・地域)ごとに異なるため、楽曲IDの固定埋め込みは避け実行時検索にする
- 再生状態の監視はポーリングではなく、非同期シーケンスによる購読で効率的に行える
音楽配信サービスとの連携ならではの、契約状態や地域差といった外部要因への配慮が必要だと実感した実装でした。
本記事は生成AI(Claude)を活用して執筆・編集しています。内容は実体験に基づき、執筆者本人が確認・監修しています。


コメント