LoginSignup
0
2

SwiftでMusicKitを使いApple Music APIを叩く【UIKit】

Last updated at Posted at 2023-07-26

概要

SwiftでMusicKitを利用してApple Music APIを叩く。

Developer Token発行のための準備

公式ドキュメント

To make requests to the Apple Music API, you need to authorize yourself as a trusted developer and member of the Apple Developer Program. The header of every Apple Music API request requires a signed developer token.

Apple Music APIを使用するためにはDeveloper Tokenが必要であると書かれているため、先ずはDeveloper Tokenを発行する。(※Tokenの発行には99$/年のApple Developer Programに加入しているアカウントが必要)

Media IDの登録

以下のURLからApple Developer Programに加入しているアカウントでサインインし、サイドバーのIdentifiersをクリックする。

image.png

太字のIdentifiersの右横にあるプラスボタンをクリックしたのち、下の方にあるMedia IDsを選択。

image.png

画面上部にあるContinueボタンをクリックして次に進み、

  • Descriptionには概要(アプリの名前)
  • Identifierには"media."+逆ドメイン(APIを叩きたいXcodeプロジェクトのBundle Identifier)

を入力する。

画面の下部のMusicKitにチェックを入れると画面右上のContinueボタンが青く押せるようになるので押して次に進む。

image.png

確認画面になるので問題なければ画面右上のRegisterを押す。これでIdentifierの登録は完了。

If you’re developing an app for Apple platforms (iOS, tvOS, watchOS or macOS), the recommended way to integrate with Apple Music is to use MusicKit for Swift, following the steps provided in Using Automatic Developer Token Generation for Apple Music API.

今回はAppleのプラットフォーム(iOS)上でAPI通信を行うため、以上の手順のみで認証を通過することができる。

MusicKit使用のための準備

プロジェクトのinfo.plistにApple Musicへのアクセスを許可するための設定を追加する。KeyはPrivacy - Media Library Usage Descriptionで、Valueは任意の文言。

Screenshot 2023-07-26 at 6.41.49.png

次に、アプリの起動時にApple Musicへのアクセスをリクエストするために、AppDelegateを以下のコードを追加する。

AppDelegate
import UIKit
+ import MusicKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+    Task {
+      await MusicAuthorization.request()
+    }
    return true
  }

これによって、アプリ起動時にApple Musicへのアクセスを許可するかどうかの確認が出る。許可を押すと、これ以降のAPI通信を行うことができる。

Apple Music APIとの通信

MusikKitにはAPI通信を簡単にするためのメソッドが用意されている。

MusicCatalogSearchRequest()

ワードで検索

一番普通のリクエスト。"Bump of Chicken"という検索ワードに引っ掛かる曲をレスポンスとして返す。

ViewController
class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
+    Task {
+      do {
+        let request = MusicCatalogSearchRequest(term: "Bump of Chicken", types: [Song.self])
+        let response = try await request.response()
+        print(response.songs)
+      } catch {
+        print("error")
+      }
+    }
  }
}

出力結果

MusicItemCollection<Song>(
  items: [
    Song(id: "1644656901", title: "Souvenir", artistName: "BUMP OF CHICKEN"),
    Song(id: "1532379727", title: "Acacia", artistName: "BUMP OF CHICKEN"),
    Song(id: "1464634457", title: "Tentaikansoku", artistName: "BUMP OF CHICKEN"),
    Song(id: "1678512925", title: "Madononakakara", artistName: "BUMP OF CHICKEN"),
    Song(id: "1564243529", title: "Nanairo", artistName: "BUMP OF CHICKEN")
  ],
  hasNextBatch: true
)

出力件数を指定

var request = MusicCatalogSearchRequest(term: "Bump of Chicken", types: [Song.self])
request.limit = 10

出力結果

MusicItemCollection<Song>(
  items: [
    Song(id: "1644656901", title: "Souvenir", artistName: "BUMP OF CHICKEN"),
    Song(id: "1532379727", title: "Acacia", artistName: "BUMP OF CHICKEN"),
    Song(id: "1464634457", title: "Tentaikansoku", artistName: "BUMP OF CHICKEN"),
    Song(id: "1678512925", title: "Madononakakara", artistName: "BUMP OF CHICKEN"),
    Song(id: "1564243529", title: "Nanairo", artistName: "BUMP OF CHICKEN"),
    Song(id: "1464635122", title: "Ray", artistName: "BUMP OF CHICKEN"),
    Song(id: "1617255367", title: "Chronostasis", artistName: "BUMP OF CHICKEN"),
    Song(id: "1464635751", title: "Karuma", artistName: "BUMP OF CHICKEN"),
    Song(id: "1610683351", title: "Shinsekai", artistName: "BUMP OF CHICKEN"),
    Song(id: "1464634874", title: "Sharinnouta", artistName: "BUMP OF CHICKEN")
  ],
  hasNextBatch: true
)

曲一件一件を取得する

let response = try await request.response()
let songs = response.songs
songs.forEach({ song in
  print(song)
})

出力結果

Song(id: "1644656901", title: "Souvenir", artistName: "BUMP OF CHICKEN")
Song(id: "1532379727", title: "Acacia", artistName: "BUMP OF CHICKEN")
Song(id: "1464634457", title: "Tentaikansoku", artistName: "BUMP OF CHICKEN")
Song(id: "1678512925", title: "Madononakakara", artistName: "BUMP OF CHICKEN")
Song(id: "1564243529", title: "Nanairo", artistName: "BUMP OF CHICKEN")

曲の長さを取得する

songs.forEach({ song in
  print(song.duration!)
})

出力結果

264.127
262.107
263.6
399.418
259.878
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2