![[iOS] iOS 9.3 の新機能を使用して Apple Music の曲の再生とライブラリへの追加を行う](https://devio2023-media.developers.io/wp-content/uploads/2014/05/ios-coreaudio-eyeCatch3.png)
[iOS] iOS 9.3 の新機能を使用して Apple Music の曲の再生とライブラリへの追加を行う
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
iOS 9.3 で「Media Player Framework」と「StoreKit Framework」に新しいメソッドが追加され、サードパーティーのアプリから以下の操作を行うことが可能になりました。
- Apple Music で提供されている曲 (Apple Music catalog tracks) を再生する
 - Apple Music で提供されている曲をミュージックライブラリに追加する
 
本記事では、これらの処理の実装方法を紹介します。
検証環境
「iOS 9.3 がインストールされた iOS 端末」と「Apple Music に加入済みの Apple ID」が必要です。
- OS X El Capitan 10.11.4
 - Xcode 7.3
 - iOS 9.3 がインストールされた iOS 端末
 - Apple Music に加入済みの Apple ID
- ¥980/月
 - 3か月の無料トライアル
 - Apple Music 紹介ページ
 
 
目次
サンプルアプリ
iOS 9.3 の新機能を試すために以下の機能をもったサンプルアプリを作成しました。
- Apple が提供している「iTunes Search API」を使用して、キーワードに一致した曲を検索する
- Apple Music で提供されている曲を対象とする
 
 - 検索で得られた曲の再生とライブラリへの追加を行う
 
サンプルアプリのコードは以下のリポジトリで公開してます。
新機能以外のコードの解説は省略します。記事上で解説していない部分のコードについては、上記リポジトリのコードを参考にしてみてください!
画面について
トップ画面
画面上部に UISearchBar を設置して、キーワードを入力できるようにしてます。ソフトウェアキーボード上の Search をタップしたタイミングで「検索結果表示画面」に遷移します。
検索結果表示画面
画面生成時に iTunes Search API に対してリクエストを投げます。レスポンスが返ってきたら UITableView に結果を表示します。リスト上のアイテムが選択されたら、「詳細画面」へ遷移します。
詳細画面
以下の機能を提供するための UI を表示します。
- 曲を再生する
 - 曲をミュージックライブラリに追加する
 
表示するデータは「検索結果表示画面」から受け取ります。
実装
各機能を実現するためのコードについて解説していきます。
ミュージックライブラリへのアクセスをリクエストする
デバイス上のミュージックライブラリへアクセスするには、ユーザーに対して権限をリクエストする必要があります。
StoreKit Framework の SKCloudServiceController クラスの requestAuthorization: メソッドを使用してリクエストします。
@import StoreKit;
...
// デバイス上のミュージックライブラリへのアクセスをリクエストする
[SKCloudServiceController requestAuthorization:^(SKCloudServiceAuthorizationStatus status) {
    NSLog(@"authorized:%@", status == SKCloudServiceAuthorizationStatusAuthorized ? @"YES" : @"NO");
    ...
}];
権限を得るまでの手順は「位置情報」や「写真ライブラリ」へのアクセスなどと同様で、はじめて権限をリクエストしたタイミングでアラートが表示されます。権限が得られた場合、 status の値は SKCloudServiceAuthorizationStatusAuthorized になります。
ミュージックライブラリ関連の機能を利用できるかを確認する
SKCloudServiceController クラスの requestCapabilitiesWithCompletionHandler: メソッドを使用すれば、以下の操作を行うことができるかを確認することができます。
- Apple Music で提供されている曲を再生する
 - Apple Music で提供されている曲をミュージックライブラリに追加する
 
// ミュージックライブラリ関連の機能を利用できるかを確認する
[self.cloudServiceController requestCapabilitiesWithCompletionHandler:^(SKCloudServiceCapability capabilities,
                                                                        NSError * _Nullable error) {
    NSLog(@"available MusicCatalogPlayback:%@", (capabilities & SKCloudServiceCapabilityMusicCatalogPlayback) ? @"YES" : @"NO");
    NSLog(@"available AddToCloudMusicLibrary:%@", (capabilities & SKCloudServiceCapabilityAddToCloudMusicLibrary) ? @"YES" : @"NO");
}];
曲を検索する
Apple が提供している「iTunes Search API」を使用して、キーワードに一致した曲を検索する機能を実装します。
リクエストを投げる
https://itunes.apple.com/search に対して GET でリクエストします。
本記事のサンプルアプリでは、検索 API に対して以下のパラメータを指定します。country に指定する「Country Code」は次のセクションで説明します。
| キー | 値 | 
|---|---|
| isStreamable | Apple Music で提供されている曲だけを対象にする場合は YES を指定 | 
| term | 検索キーワードを指定 | 
| media | メディアのタイプ (今回は music を指定) | 
| limit | 最大件数 (今回は 100 を指定) | 
| country | Country Code | 
NSDictionary *parameters = @{
                             @"isStreamable" : @(YES),
                             @"term" : keyword,
                             @"media" : @"music",
                             @"limit" : @(100),
                             @"country" : countryCode
                             };
// iTunes Search API にリクエストを投げる
[self.HTTPSessionManager GET:@"https://itunes.apple.com/search"
                  parameters:parameters
                    progress:nil
                     success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
                         // 成功時の処理
                         ...
                     }
                     failure:nil];
Country Code を取得する
以下の手順で Country Code を取得します
- Storefront ID を取得する
 - Storefront ID を Country Code に変換する
 
1. Storefront ID を取得する
「Storefront ID」は iTunes Store のストア ID で、値は国ごとに異なります。日本の場合は「143462」になります。
本記事のサンプルアプリでは、iTunes Search API で曲を検索して曲の ID (Track ID) を取得し、この ID を使用して「再生」と「ミュージックライブラリへの追加」を行います。デバイス上で選択しているストアが異なれば、同じ曲でも曲の ID が異なるので、正しい Storefront ID を取得する必要があります。
SKCloudServiceController クラスの requestStorefrontIdentifierWithCompletionHandler: メソッドを使用すれば、Storefront ID を取得できます。
// Storefront ID を取得する
[self.cloudServiceController requestStorefrontIdentifierWithCompletionHandler:^(NSString * _Nullable storefrontIdentifier,
                                                                                NSError * _Nullable error) {
    NSString *identifier = [[storefrontIdentifier componentsSeparatedByString:@","] firstObject];
    identifier = [[identifier componentsSeparatedByString:@"-"] firstObject];
    NSString *countryCode = [self countryCodeWithIdentifier:identifier];
    ...
}];
筆者が試した環境では、storefrontIdentifier は「143462-1,29」という値になりました。前方の 6 桁の数字 (143462) だけ取り出します。プライベートメソッド countryCodeWithIdentifier については次の「2. Storefront ID を Country Code に変換する」で説明します。
2. Storefront ID を Country Code に変換する
「1. Storefront ID を取得する」で取得した Storefront ID を Country Code に変換します。 Storefront ID と Country Code の対応表は以下のページの「Appendix: Country Codes and Storefront IDs」項目に載っています。
日本のストアの Country Code は「JP」になります。
- (NSString *)countryCodeWithIdentifier:(NSString *)identifier
{
    // Storefront ID を Country Code に変換する
    NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"CountryCodes"
                                              withExtension:@"plist"];
    NSDictionary *countryCodeDictionary = [NSDictionary dictionaryWithContentsOfURL:plistURL];
    return countryCodeDictionary[identifier];
}
曲を再生する
Media Player Framework の MPMusicPlayerController クラスの setQueueWithStoreIDs: メソッドを使用すれば、MPMusicPlayerController クラスの「再生キュー」に曲を追加できます。play メソッドを呼ぶと、「再生キュー」に入っている曲が再生されます。
@import MediaPlayer; ... // MPMusicPlayerController クラスの「再生キュー」に曲を追加し、曲を再生する [self.musicPlayerController setQueueWithStoreIDs:@[self.item.identifier]]; [self.musicPlayerController play];
曲をミュージックライブラリへ追加する
Media Player Framework の MPMediaLibrary クラスの addItemWithProductID:completionHandler: メソッドを使用すれば、曲をライブラリへ追加することができます。ハンドラブロックの entities 引数には、ミュージックライブラリに追加した曲の情報が入ります。
// 曲をミュージックライブラリへ追加する
[[MPMediaLibrary defaultMediaLibrary]
 addItemWithProductID:self.item.identifier
 completionHandler:^(NSArray<__kindof MPMediaEntity *> * _Nonnull entities, NSError * _Nullable error) {
     NSLog(@"entities:%@", entities);
 }];
まとめ
本記事では iOS 9.3 の新機能を使用して「Apple Music の曲の再生」と「ライブラリへの追加」を行う実装を紹介しました。既存の音楽系アプリの追加機能として使えそうですね。
音楽認識アプリ「Shazam」のバージョン 9.4.1 で追加された機能は、今回紹介した iOS 9.3 の新機能が活用されているようです。
バージョン 9.4.1 の新機能
Shazamは新しいApple Musicに対応しています! iOS 9.3にアップグレードし、Shazam設定で接続すると次のことができます:
• Apple MusicプレイリストにShazamトラックを追加。
• 「マイ Shazam トラック」プレイリストに保存されているすべてのShazam曲をApple Musicで閲覧。
• Shazamを閉じなくても、曲をフルで聴けます!
今回作成したサンプルアプリのソースコードは以下のリポジトリで公開してますので参考にしてみてください。
参考ページ
- Details on the iOS 9.3 Media Library additions - Ben Dodson
 - Storefront Additions: A simple way to convert SKCloudServiceController store identifiers into country codes - Ben Dodson
 - bendodson/storefront-assistant - GitHub
 - [iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(AVAudioPlayer使用) - nackpan Blog
 
クラスリファレンス・プログラミングガイド
- iOS 9.3 - What's New in iOS
 - iOS 9.2 to iOS 9.3 API Differences
 - SKCloudServiceController Class Reference
 - MPMediaLibrary Class Reference
 - iPodライブラリアクセスプログラミングガイド
 













