※ まだ正式リリースされていない情報なので変更の可能性があります⚠️
個人的には一番嬉しいアップデートがこのMusicKitでした😎🎸今までiTunes APIの中からストリーミング可能なものを抜き出して使っていたのがApple Music APIとして切り出されました。それだけでなくユーザーのおすすめカタログなどパーソナライズデータにもアクセスできるようになりました👏
今回の手順やリファレンスは下記のリンクにまとまっているので目を通すといいと思います👀
https://developer.apple.com/musickit/
What's MusicKit
MusicKitは下記のAPIとフレームワークで構成されている。単体のフレームワークではないのでAPIのみであればWebでも使える👏
- Apple Music API: Apple Musicの曲やプレイリストを取得する
- StoreKit(Framework): Apple Musicの使用許可やトークンの取得を行う
- MediaPlayer(Framework): Apple Musicの曲やプレイリストを再生する
Apple Music API
Keys and Tokens
Apple Music APIを使用するにはPrivate Keyの取得とDeveloper Token(JWT)の生成が必要
面倒ですがパーソナライズされたデータにアクセスするのでしょうがないです😭
Music Identifier
下記ページにアクセスしてMusic Identifierを登録する
https://developer.apple.com/account/ios/identifier/musicId
MusicKit Private Key
下記ページにアクセスしてMusicKitのプライベートキーを作成する
https://developer.apple.com/account/ios/authkey
Developer Token
Developer Token(Json Web Token)を作成する
- アルゴリズムはES256を使用する
- カスタムヘッダーに上記で作成したプライベートキーのKey IDを入れる
- IssuerにはチームIDを入れる
- Issued AtにはこのJWTの発行時間をUnix Timeで入れる
- Expiration Timeには6ヶ月以内の有効期限をUnix Timeで入れる
{
"alg": "ES256",
"kid": "<MusicKit Key ID>"
}
{
"iss": "<Team Identifier>",
"iat": 1437179036,
"exp": 1493298100
}
ライブラリを使ってエンコードしたいが、Swift4に対応しているものがない😭
Storefronts and Localizations
-
storefronts
: 国や地域ごとに配信コンテンツが異なり、それを変更できる -
langage_code
: 指定した言語に翻訳される。指定しない場合はstorefronts
のデフォルト言語になる
GET https://api.music.apple.com/v1/catalog/{storefronts}/albums/310730204?l={langage_code}
Storefronts
Storefrontsのデータは下記のリクエストで取得できる
-
id
: ISO-Alpha2 Country Code
GET https://api.music.apple.com/v1/storefronts/{id}
Request
全てのリクエストのヘッダーにAuthorization
をキーにした上記のDeveloper Tokenを渡す(頭にBearer
をつける)
curl -v -H 'Authorization: Bearer [developer token]' "https://api.music.apple.com/v1/catalog/us/songs/203709340"
Reference
Apple Music API Referenceにまとまっている🙆(iTunes Search APIのよりは見やすい)
- Storefrontsの取得
- アルバム/曲/プレイリスト/ミュージックビデオ/Stationsの取得
- アーティスト/Curators/Activities/AppleCuratorsの取得
- チャートの取得
- ジャンルの取得
- Catalogの検索
- ヘビーローテーションの取得※
- 最近聞いた曲/Stationsの取得※
- 評価の管理※
- おすすめの取得※
※ ユーザーのApple Musicコンテンツを取得するにはStoreKitでMusic User Tokenを取得する必要がある
StoreKit
Accessing the Music Library
-
authorizationStatus()
: ユーザが選択したMusic Library(Apple Music含む)利用許可の状態を確認する -
requestAuthorization(_:)
: ユーザにMusic Library(Apple Music含む)の利用許可を求める
// SKCloudServiceController
class func authorizationStatus() -> SKCloudServiceAuthorizationStatus
// SKCloudServiceController
class func requestAuthorization(_ handler: @escaping (SKCloudServiceAuthorizationStatus) -> Void)
※ Music LibraryへのアクセスにはInfo.plist
にNSAppleMusicUsageDescription
の記述が必要です⚠️
SKCloudServiceAuthorizationStatus
-
notDetermined
: まだ利用許可に応答したことがない -
denied
: 利用を拒否した -
restricted
: 教育モードなどで利用許可すらできない -
authorized
: 利用を許可した
Capabilities
Music Libraryで利用できる機能を確認できる(Apple Musicのメンバーシップがあるか確認できる)
func requestCapabilities(completionHandler: @escaping (SKCloudServiceCapability, Error?) -> Void)
SKCloudServiceCapability
-
musicCatalogPlayback
: Apple Musicの曲を再生できる -
musicCatalogSubscriptionEligible
: Apple Musicの曲を取得できる -
addToCloudMusicLibrary
: 曲をMusic Libraryに追加できる
Storefronts for Device
デバイスに設定されたリージョンからStorefrontsを取得できる
func requestStorefrontCountryCode(completionHandler: @escaping (String?, Error?) -> Void)
今まではrequestStorefrontIdentifier(completionHandler:)
から自力で変換するしかなくて面倒だった😭
Music User Token
ユーザーのApple Musicコンテンツを取得する為のトークンを取得できる
func requestUserToken(forDeveloperToken developerToken: String, completionHandler: @escaping (String?, Error?) -> Void)
下記のような/me
パスで取得できる最近再生した曲やレコメンドなどに使う
GET https://api.music.apple.com/v1/me/recent/played
GET https://api.music.apple.com/v1/me/recommendations
GET https://api.music.apple.com/v1/me/ratings/albums/{id}
GET https://api.music.apple.com/v1/me/recommendations
...
MediaPlayer
Play Apple Music Catalog
Apple Musicの曲やアルバムの再生、プレイリストの作成を行う🎧
MPMusicPlayerController
-
setQueue(with:storeIDs)
: Apple Music APIで取得したStore Identifier(曲やアルバムごとのID)から再生できる -
setQueue(with:descriptor)
: キューを指定しながら曲の再生ができる(以前Qiitaに書いたのでどうぞ👏)
func setQueue(with storeIDs: [String])
func setQueue(with descriptor: MPMusicPlayerQueueDescriptor)
ex.) 下記リクエストの場合だとアルバムのid
を入れるだけで再生ができる
https://api.music.apple.com/v1/catalog/us/albums/310730204
{
"data": [
{
"href": "/v1/catalog/us/albums/310730204",
"id": "310730204",
"artists": {...},
"tracks": {...},
...
MPMusicPlayerPlayParametersQueueDescriptor
今回iOS11で追加されたMPMusicPlayerQueueDescriptor
の継承クラス。PlayParameterQueueとは🤔
セッションを見た感じApple Music APIのクエリをそのままキューとして使うことができる?
init(playParametersQueue: [[String : Any]])
MPMediaLibrary
UUID
とMPMediaPlaylistCreationMetadata
で指定した既存または新規でプレイリストを取得する
// MPMediaLibrary
func getPlaylist(with uuid: UUID, creationMetadata: MPMediaPlaylistCreationMetadata?, completionHandler: @escaping (MPMediaPlaylist?, Error?) -> Void)
MPMediaPlaylist
プレイリストに曲やアルバムを追加する(一曲ずつしか追加できない😢)
// MPMediaPlaylist
func addItem(withProductID productID: String, completionHandler: ((Error?) -> Void)? = nil)
※ getPlaylist:
で取得してスグにプレイリストを使おうとするとエラーになる時がある。解決策は今の所5秒待つことらしい…😟
iOS9の時から少しずつアップデートを繰り返してきたサードパーティへのApple Musicの機能提供ですが、今回のアップデートはかなり大きなものになりました👏これを機会に素晴らしい音楽アプリが増えればいいなと思います🙏
おしまい👋