『基礎からのiPhone SDK改訂版』おまけ

2010. 07. 30
『基礎からのiPhone SDK改訂版』まとめ(2)『基礎からのiPhone SDK改訂版』まとめ(3)の中で、概要を訳していないクラスがいくつかありましたので補填します。

訳していなかったのは訳すのが困難だったかららしく、いつにも増して怪しい訳になっていますので原文を読むことをお勧めします。


●Foundation関数

この章では、Foundationフレームワークで定義されている、関数および 関数のようなマクロを説明します。


●NSDictionaryクラス

NSDictionaryクラスは、キーと値の不変な関連付けを管理するオブジェクトのプログラムインターフェイスを宣言します。

このクラスまたはサブクラスのNSMutableDictionaryは、任意のキーに関連付けられたデータを便利に且つ効率的に取得する場合に使用します。

(便宜上、厳密な特定のクラスメンバを除いて、これらのクラスのインスタンスを辞書(dictionary)と呼びます)

辞書のキーと値のペアをエントリと呼びます。

各エントリの構成は、キーとキーの値となるオブジェクトで一つのオブジェクトとして表されます。

辞書内でキーは固有のものになります。

一つの辞書の中で、(isEqual:で確認できる)同じキーが2つ存在してはいけません。

キーは(NSCopyingプロトコルに準拠している)任意のオブジェクトを指定できますが、一般的にはキー値コーディングで使用できるよう、キーには文字列を使用します。
(『Key-Value Coding Fundamentals』参照)

キーも値もnilにすることはできません。

辞書内でnull値を表す場合は、NSNullを使用してください。

NSDictionaryのインスタンスは不変辞書で、エントリを確立して生成した後で変更することはできません。

NSMutableDictionaryのインスタンスは可変辞書で、いつでもエントリの追加や削除ができ、オブジェクトは自動的にメモリを必要に応じて割り当てます。

辞書クラスはNSCopyingとNSMutableCopyingプロトコルを採用しており、他の辞書の型を容易に変換することができます。

NSDictionaryとNSMutableDictionaryはクラスクラスタの一部で、このインターフェイスで生成したオブジェクトは、これら2つのクラスの実際のインスタンスではありません。

正確には、インスタンスはこれらのプライベートサブクラスの一つに属しています。

辞書のクラスはプライベートですがインターフェイスはパブリックで、NSDictionaryとNSMutableDictionaryの抽象的なスーパークラスで宣言されています。

辞書は内部的に、キーに一致する値に迅速にアクセスするため、ストレージの構成にハッシュテーブルを使用しています。

しかしハッシュテーブルやハッシュ関数、キーのハッシュ値などの作業は複雑なため。このクラスタのメソッドの定義からは隔離されています。

メソッドがハッシュ形式ではなく、キーを直接取得する方法を以下で説明します。

(全ての辞書における初期化の一部、または可変辞書における変更として)メソッドが辞書にエントリを追加する際、引数の各キーをコピーし、辞書にコピーを追加します。
(キーはNSCopyingプロトコルに準拠している必要があります)

対応する各値オブジェクトは、辞書に渡す前に解放されないようにretainメッセージを受け取ります。

列挙

辞書のコンテンツとして、keyEnumeratorとobjectEnumeratorで返されるNSEnumeratorオブジェクトを使って、キーや値を列挙することができます。

Mac OS X v10.5以降では、NSDictionaryはNSFastEnumerationプロトコルをサポートします。

辞書のキーをfor...inを使って列挙で構築する例を以下に示します。

NSArray *keys = [NSArray arrayWithObjects:@"key1", @"key2", @"key3", nil];
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

for (id key in dictionary) {
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]);
}

Mac OS X v10.6以降ではNSDictionaryはブロックオブジェクトを使用した列挙をサポートしています。

基本的なメソッド

NSDictionaryの基本的な三つのメソッド(count、objectForKey:、keyEnumerator)は、他のメソッドのインターフェイスの全ての基礎を提供します。

countメソッドは辞書内のエントリ数を返します。

objectForKey:は指定したキーに関連する値を返します。

keyEnumeratorは辞書内の各キーを反復処理するオブジェクトを返します。

他のメソッドは、一つ以上の三つの基礎的なメソッドを呼び出すことによって処理の宣言をします。

基礎的なメソッド以外は、複数のエントリに一度にアクセスする便利な方法を提供します。

説明と永続性

description...とwriteToFile:atomicallyメソッドは、辞書のプロパティリストの説明に、それぞれ文字列とファイルを書き込むことができます。

これらは一般的に、カステムデータオブジェクトの永続的なストレージに使用されるものではありません。
(『Archives and Serializations Programming Guide』を参照してください)

Toll-Free Bridging

NSDictionaryには『toll-free bridged』の対象としてCore FoundationのCFDictionary Referenceがあります。

これはFoudationオブジェクトを橋渡ししてCore Foundationの型に変換し、関数やメソッドで呼び出せることを意味します。

したがってNSDictionary *パラメータを参照する際、CFDictionaryRefに渡し、CFDictionaryRefパラメータとして参照でき、(コンパイラの警告を抑えるために型変換をして)NSDictionaryインスタンスに渡すこともできます。

この橋渡しは、NSDictionaryの実際のサブクラスに適用されます。

型変換に関する詳細は『toll-free bridging』を参照してください。

サブクラス化

通常、NSDictionaryをサブクラス化する必要はあまりありません。

カスタマイズした動作が必要な場合、サブクラス化するより良い構成を検討してください。

NSDictionaryをサブクラス化する必要がある場合、クラスクラスタで表されていることを考慮に入れる必要があります。

したがって、基礎的な概念としていくつかの基本的なメソッド
count
objectForKey:
keyEnumerator
を、サブクラスでは全てオーバーライドする必要があります。

NSDictionaryの他のメソッドは、一つ以上のこれら基本的なメソッドを呼び出して処理します。

基礎的なメソッド以外は、複数のエントリに一度にアクセスする便利な方法を提供します。


●NSLocaleクラス

ロケールは、言語や文化、技術的な慣習や基準についての情報をカプセル化します。

ロケールがカプセル化する情報には数字の小数点で使われる記号や、日付などの書式を含みます。

ロケールは通常、ユーザの習慣や好みに基づいて、情報を解釈する書式を提供します。

ロケールはしばしばフォーマッタと共に使用されます。
(『Data Formatting Guide』を参照)

多くのロケールを使用することができますが通常はユーザが現在関連付けしている一つを使います。

NSLocaleには『toll-free bridged』の対象としてCore FoundationのCFLocaleがあります。

これはFoudationオブジェクトを橋渡ししてCore Foundationの型に変換し、関数やメソッドで呼び出せることを意味します。

したがってNSLocale *パラメータを参照する際、CFLocaleRefに渡し、CFLocaleRefパラメータとして参照でき、(コンパイラの警告を抑えるために型変換をして)NSLocaleインスタンスに渡すこともできます。

型変換に関する詳細は『toll-free bridging』を参照してください。


●NSURLクラス

NSURLクラスは、URLと参照するリソースを処理する方法を提供します。

NSURLオブジェクトは、RFC 1808、1738、2732で指定されているURLを解釈します。

RFC 1808が推奨する、RFC 1808に準拠しているかどうかの判別法は、resourceSpecifierの最初の二文字が@"//"であるかどうかです。

NSURLオブジェクトはファイルの参照に使用することができ、この方法が推奨されています。

ApplicationKitオブジェクトは一般的に、ファイルからのデータの読み込みやファイルへのデータの書き込みを行うメソッドを持っていますが、NSURLオブジェクトがファイル参照のパス名を代わりに受け入れます。

NSWorkspaceは、URLで指定されている場所を開くopenURL:を提供します。

NSStringが提供するstringWithContentsOfURL:やNSDataが提供するdataWithContentsOfURL:で、URLのコンテンツを取得します。

NSURLオブジェクトは二つの部分で構成されており、潜在的にnilベースのURLとベースURLに関連して決定される文字列から成ります。

NSURLオブジェクトのベースを除いた完全に決定された文字列は絶対的なもので、他の全ては相対的なものです。

NSURLクラスは、NSURLオブジェクトを新たに生成する際に的確なパスを渡さないと失敗します。
(パスはRFC 2396を満たす必要があります)

例えば、空白文字や高ビット文字を含む文字列は成功しません。

NSURLオブジェクトの生成に失敗すると生成メソッドはnilを返すので、対応する処理を準備する必要があります。

ファイルシステムパスを使ってNSURLオブジェクトを生成する際、fileURLWithPath:またはinitFileURLWithPath:を使うことができ、URLパスとファイルシステムパスの微妙な差異を処理できます。

不正なパス文字列への耐性を持たせたい場合は、Core Foundationフレームワークの提供する文字列を仕上げる関数を使用する必要があります。

NSURLConnectionとNSURLDownloadクラスには、バックグラウンドでURLリソースを読み込む有用なメソッドが定義されています。

詳細は『URL Loading System Programming Guide』を参照してください。

また、アプリケーションキットフレームワーク内のNSURL追加リファレンスに、ペーストボードをサポートする追加メソッドがあります。

NSURLには『toll-free bridged』の対象としてCore FoundationのCFURL Referenceがあります。

これはFoudationオブジェクトを橋渡ししてCore Foundationの型に変換し、関数やメソッドで呼び出せることを意味します。

したがってAPIでNSURL *パラメータを参照する際、CFURLRefに渡し、APIはCFURLRefパラメータとして参照でき、(コンパイラの警告を抑えるために型変換をして)NSURLインスタンスにポインタを渡すこともできます。

この方法はまた、実際のNSURLのサブクラスにも適用されます。

型変換に関する詳細は『toll-free bridging』を参照してください。


●NSURLProtectionSpaceクラス

NSURLProtectionSpaceは、サーバまたはサーバ上のエリアにある領域を表し、一般的に参照するには認証を要求されます。

保護領域内への全てのリクエストにNSURLProtectionSpaceの証明書が適用されます。


●NSURLRequestクラス

NSURLRequestオブジェクトは、プロトコルから独立した方法でのURLの読み込み要求とURLスキームを表します。

NSURLRequestは、URLの読み込みと、URLコンテンツを使用するためのキャッシュ作成の実装についてのポリシーといった、URLの読み込み要求に二つの基本的なデータ要素カプセル化します。

NSURLRequestは、NSURLProtocolのpropertyForKey:inRequest:とsetProperty:forKey:inRequest:メソッドを使って、プロパティオブジェクトからプロトコル固有の値にアクセスする、追加カテゴリによる追加プロトコルをサポートする拡張ができる設計になっています。

NSURLRequestの可変サブクラスはNSMutableURLRequestです。


●UIControlクラス

UIControlは制御の基礎となるクラスで、ボタンやスライダなど、アプリケーションにユーザの意図を伝えるために使用されます。

UIControlのインスタンスを直接制御に使用することはできません。

その代わり全てのサブクラスについて、共通のインターフェイスと動作の構造体を定義します。

UIControlの主な役割は、アクションメッセージを準備するための基礎となる実装と、指定したイベントが発生した時に最初にターゲットにディスパッチするインターフェイスを定義することです。
(『Target-Action in UIKit』の概要を参照)

また、(制御の有効や強調を決定などのための)制御状態の設定と取得をするメソッドと、(後でメソッドのグループのサブクラスによるオーバーライドのために)制御中にタッチの追跡を行うメソッドの定義を含みます。

ターゲット−アクションメカニズム

UIKitフレームワークのターゲット−アクションメカニズムの設計は、マルチタッチイベントモデルに基づいています。

iOSは、(マウスのクリックやドラッグの代わりに)ユーザの指(またはタッチ)により意図を伝達し、異なる接触をいつでも制御するマルチタッチがあります。

UIControl.hヘッダファイルは、『Control Events』で説明されているビットマスクの定数で、制御イベントを多数宣言しています。

いくつかの制御イベントは、コントロールの中と周囲にタッチする動作を指定しており、コントロールに指を降ろしてタッチする、コントロールの外から中にまたは中から外にドラッグするなど、様々なアクションの組み合わせがあります。

他の制御イベントとして、テキストフィールドに指を降ろしてタッチした時に、編集フェーズの開始が指定されています。

またUIControlEventValueChangedは、スライダなどのコントロール上の操作を連続した値の変化として受け取ります。

特定のアクションメッセージの場合は、指定した一つ以上の制御イベントをトリガとして、メッセージを送信することができます。

例えば、コントロールに指を降ろしてタッチするか中にドラッグした場合(UIControlEventTouchDown | UIControlEventTouchDragEnter)に、特定のターゲットに特定のアクションメッセージを送信することができます。

アクションメッセージを送信するためのコントロールの準備には、各ターゲット−アクションのペアごとにaddTarget:action:forControlEvents:の呼び出しを指定します。

このメソッドは、制御イベントに各ターゲット−アクションのペアを関連付けしたディスパッチテーブルを内部に構築します。

ユーザがコントロールにタッチした方法の中に、指定したイベントが一つ以上一致した場合は、UIControlがsendActionsForControlEvent:を送信します。

その結果UIControlはsendAction:to:from:forEvent:メッセージのUIApplicationにアクションを送信します。

UIApplicationはアクションメッセージのディスパッチポイントを中央に集め、アクションメッセージのターゲットにnilが指定されている場合は、アクションメッセージを処理するオブジェクトが見つかるまでレスポンダチェーンを逆上り、アプリケーションはファーストレスポンダにアクションを送信します。

つまり、アクションセレクタに対応するメソッドを実装するオブジェクトです。

UIKitは三つの異なる形体のアクションセレクタを提供します。

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

UIApplicationのsendAction:to:fromSender:forEvent:メソッドは、ターゲットを呼び出す時に二つのパラメータを送信します。

最後の二つのパラメータはアプリケーションのためのオプションで、呼び出し元(通常はUIControlオブジェクト)で任意のパラメータを削除するために追加されています。

サブクラス化の注意

UIControlをサブクラス化して拡張するのには、二つの基本的な理由があります。

・特定のイベントのターゲットとして、アクションメッセージのディスパッチを監視または変更する場合。

この場合、sendAction:to:forEvent:をオーバーライドし、セレクタ、ターゲットオブジェクト、またはビットマスクを必要に応じて評価します。

・強調の外観を変更するなど、動作をカスタマイズして提供する場合。

この場合、以下のメソッド一つまたは全てをオーバーライドします。
beginTrackingWithTouch:withEvent:
continueTrackingWithTouch:WithEvent:
endTrackingWithTouch:with:Event:



参考文献

Foundation Functions Reference

NSDictionary Class Reference

NSLocale Class Reference

NSURL Class Reference

NSURLProtectionSpace Class Reference

NSURLRequest Class Reference

UIControl Class Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

『基礎からのiPhone SDK改訂版』まとめ(3)

2010. 07. 28
基礎からのiPhone SDK 改訂版』で勉強してきた過程で、説明用に訳したクラスの概要とメソッドの解説の一覧の続きです。

字数制限の都合上、メソッドの解説がクラスの概要と同ページの場合は、メソッドにリンクを張っていないので予めご了承ください。


●UIActionSheetクラスメモ帳の作成(5)~アクションシート
・initWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:
・showInView:


●UIActionSheetDelegateプロトコルメモ帳の作成(5)~アクションシート
・actionSheet:clickedButtonAtIndex:


●UIActivityIndicatorViewクラスウェブブラウザの使用しているクラス
・isAnimating(ウェブブラウザのデリゲート
・startAnimating(ウェブブラウザのデリゲート
・stopAnimating(ウェブブラウザのデリゲート


●UIAlertViewクラスメモ帳の作成(6)~アラート
・initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:
・show


●UIAlertViewDelegateプロトコルメモ帳の作成(6)~アラート
・alertView:clickedButtonAtIndex:


●UIApplicationクラスフルスクリーン化で使用しているクラス(3)
・idleTimerDisabled(トランジションアニメーション(1)
・openURL:(メモ帳の作成(6)~アラート
・setStatusBarHidden:animated:(スライドショーの簡易アニメーション(1)
・setStatusBarHidden:withAnimation:(スライドショーの簡易アニメーション(2)
・sharedApplication(スライドショーのフルスクリーン化(2)
・statusBarHidden(スライドショーのフルスクリーン化(2)
・UIStatusBarAnimation(スライドショーの簡易アニメーション(2)


●UIApplicationDelegateプロトコルUIApplicationDelegateプロトコル
・applicationDidBecomeActive:
・application:didChangeStatusBarFrame:
・application:didChangeStatusBarOrientation:
・application:didFailToRegisterForRemoteNotificationsWithError:
・applicationDidFinishLaunching:
・application:didFinishLaunchingWithOptions:
・applicationDidReceiveMemoryWarning:
・application:didReceiveRemoteNotification:
・application:didRegisterForRemoteNotificationsWithDeviceToken:
・application:handleOpenURL:
・applicationSignificantTimeChange:
・application:willChangeStatusBarFrame:
・application:willChangeStatusBarOrientation:duration:
・applicationWillResignActive:
・applicationWillTerminate:


●UIBarButtonItemクラスウェブブラウザの使用しているクラス


●UIBarItemクラスウェブブラウザの使用しているクラス
・enable(ウェブブラウザのデリゲート


●UIButtonクラススライドショーの使用しているクラス(1)
・setBackgroundImage:forState:(スライドショーのメソッド(2)
・setTitle:forState:(スライドショーのメソッド(3)


●UIControlクラス『基礎からのiPhone SDK改訂版』おまけ
・UIControlState(スライドショーのメソッド(2)
・Control State(スライドショーのメソッド(2)


●UIFontクラスメモ帳の作成(3)~フォント
・familyNames(メモ帳の作成(3)~フォント
・fontNamesForFamilyName:(メモ帳の作成(3)~フォント
・fontWithName:size:(メモ帳の作成(4)~ピッカービュー


●UIImageクラススライドショーの使用しているクラス(2)
・imageNamed:(スライドショーのメソッド(1)
・stretchableImageWithLeftCapWidth:topCapHeight:(スライドショーのメソッド(2)


●UIImageViewクラススライドショーの使用しているクラス(1)
・animationDuration(スライドショーのメソッド(2)
・animationImages(スライドショーのメソッド(2)
・animationRepeatCount(スライドショーのメソッド(2)
・image(トランジションアニメーション(1)
・isAnimating(スライドショーのメソッド(3)
・startAnimating(スライドショーのメソッド(3)
・stopAnimating(スライドショーのメソッド(3)


●UIPickerViewクラスメモ帳の作成(4)~ピッカービュー
・selectedRowInComponent:(メモ帳の作成(4)~ピッカービュー
・selectRow:inComponent:animated:(メモ帳の作成(7)~設定値の保存


●UIPickerViewDataSourceプロトコルメモ帳の作成(4)~ピッカービュー
・numberOfComponentsInPickerView:
・pickerView:didSelectRow:inComponent:
・pickerView:numberOfRowsInComponent:


●UIPickerViewDelegateプロトコルメモ帳の作成(4)~ピッカービュー
・pickerView:titleForRow:forComponent:
・pickerView:widthForComponent:


●UIResponderクラスフルスクリーン化で使用しているクラス(2)
・resignFirstResponder(メモ帳の作成(2)~テキストビュー
・touchesEnded:withEvent:(スライドショーのフルスクリーン化(2)


●UISegmentedControlクラススライドショーの使用しているクラス(1)
・selectedSegmentIndex(スライドショーのメソッド(1)


●UISliderクラススライドショーの使用しているクラス(1)
・value(スライドショーのメソッド(2)


●UITextFieldクラスウェブブラウザの使用しているクラス
・text(ウェブブラウザのアクションメソッド


●UITextViewクラスメモ帳の作成(2)~テキストビュー


●UITextViewDelegateプロトコルメモ帳の作成(2)~テキストビュー
・textViewDidBeginEditing:
・textViewDidEndEditing:


●UIToolbarクラスウェブブラウザの使用しているクラス


●UITouchクラスフルスクリーン化で使用しているクラス(2)
・tapCount(スライドショーのフルスクリーン化(2)


●UIViewクラスフルスクリーン化で使用しているクラス(1)
・addSubview:(音楽プレイヤのメソッド(1)
・alpha(スライドショーの簡易アニメーション(1)
・animateWithDuration:animations:(トランジションアニメーション(2)
・animateWithDuration:animations:completion:(トランジションアニメーション(2)
・animateWithDuration:delay:options:animations:completion:(トランジションアニメーション(2)
・beginAnimations:context:(スライドショーの簡易アニメーション(1)
・center(スライドショーの簡易アニメーション(1)
・commitAnimations(スライドショーの簡易アニメーション(1)
・drawRect:(スライドショーのフルスクリーン化(2)
・frame(スライドショーの簡易アニメーション(2)
・hidden(スライドショーのフルスクリーン化(2)
・initWithFrame:(スライドショーのフルスクリーン化(2)
・removeFromSuperview(音楽プレイヤのメソッド(2)
・setAnimationDuration:(トランジションアニメーション(1)
・setAnimationsEnabled:(スライドショーの簡易アニメーション(1)
・setAnimationTransition:forView:cache:(トランジションアニメーション(1)
・transform(スライドショーの簡易アニメーション(3)
・transitionFromView:toView:duration:options:completion:(トランジションアニメーション(2)
・transitionWithView:duration:options:animations:completion:(トランジションアニメーション(2)
・UIViewAnimationOptions(トランジションアニメーション(2)
・UIViewAnimationTransition(トランジションアニメーション(1)


●UIWebViewクラスウェブブラウザの使用しているクラス
・canGoBack(ウェブブラウザのデリゲート
・canGoForward(ウェブブラウザのデリゲート
・loading(ウェブブラウザのデリゲート
・loadRequest:(ウェブブラウザのアクションメソッド
・request(ウェブブラウザのデリゲート


●UIWebViewDelegateプロトコルUIWebViewDelegateプロトコル
・webView:shouldStartLoadWithRequest:navigationType:
・webViewDidStartLoad:
・webViewDidFinishLoad:
・webView:didFailLoadWithError:



参考文献

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

『基礎からのiPhone SDK改訂版』まとめ(2)

2010. 07. 28
基礎からのiPhone SDK 改訂版』で勉強してきた過程で、説明用に訳したクラスの概要とメソッドの解説の一覧です。

字数制限の都合上、メソッドの解説がクラスの概要と同ページの場合は、メソッドにリンクを張っていないので予めご了承ください。


●AVAudioPlayerクラスCore Audioの復習
・delegate(クロックに時報を追加する
・initWithContentsOfURL:error:(クロックに時報を追加する


●AVAudioPlayerDelegateプロトコルクロックに時報を追加する
・AudioPlayerBeginInterruption:
・audioPlayerDecodeErrorDidOccur:error:
・audioPlayerDidFinishPlaying:successfully:
・audioPlayerEndInterruption:


●CGAffineTransformスライドショーの簡易アニメーション(3)
・CGAffineTransformIdentity
・CGAffineTransformISIdentity
・CGAffineTransformMakeRotation
・CGAffineTransformScale


●CGGeometryスライドショーの簡易アニメーション(1)
・CGRectGetHeight


●Foundation関数『基礎からのiPhone SDK改訂版』おまけ
・NSLocalizedString(メモ帳の作成(8)~ローカライズ


●Media Playerフレームワーク音楽プレイヤで使用しているクラス


●MPMediaItemクラス音楽プレイヤで使用しているクラス
・General Media Item Property Keys(音楽プレイヤのメソッド(2)
・valueForProperty(音楽プレイヤのメソッド(2)


●MPMediaItemArtworkクラス音楽プレイヤで使用しているクラス
・imageWithSize:(音楽プレイヤのメソッド(2)


●MPMediaPlaylistクラス音楽プレイヤで使用しているクラス
・Playlist Property Keys(指定したプレイリストの再生
・valueForProperty(指定したプレイリストの再生


●MPMediaPropertyPredicateクラス検索条件によるクエリの絞り込み
・Media Property Predicate Comparison Types
・predicateWithValue:forProperty:comparisonType:


●MPMediaQueryクラスアプリケーション音楽プレイヤ
・addFilterPredicate:(検索条件によるクエリの絞り込み
・artistsQuery(アプリケーション音楽プレイヤ
・collections(指定したプレイリストの再生
・playlistsQuery(指定したプレイリストの再生


●MPMusicPlayerControllerクラス音楽プレイヤで使用しているクラス
・applicationMusicPlayer(アプリケーション音楽プレイヤ
・beginGeneratingPlaybackNotifications(音楽プレイヤのメソッド(1)
・currentPlaybackTime(音楽プレイヤのメソッド(1)
・endGeneratingPlaybackNotifications(音楽プレイヤのメソッド(2)
・iPodMusicPlayer(音楽プレイヤのメソッド(1)
・MPMusicPlayerControllerNowPlayingItemDidChangeNotification(音楽プレイヤのメソッド(1)
・nowPlayingItem(音楽プレイヤのメソッド(2)
・pause(音楽プレイヤのメソッド(1)
・play(音楽プレイヤのメソッド(1)
・playbackState(音楽プレイヤのメソッド(1)
・Playback States(音楽プレイヤのメソッド(1)
・repeatMode(音楽プレイヤのメソッド(1)
・Repeat Modes(音楽プレイヤのメソッド(1)
・setQueueWithItemCollection:(指定したプレイリストの再生
・setQueueWithQuery:(アプリケーション音楽プレイヤ
・shuffleMode(音楽プレイヤのメソッド(1)
・Shuffle Modes(音楽プレイヤのメソッド(1)
・skipToBeginning(音楽プレイヤのメソッド(1)
・skipToNextItem(音楽プレイヤのメソッド(1)
・skipToPreviousItem(音楽プレイヤのメソッド(1)


●NSArrayクラススライドショーの使用しているクラス(2)
・array(スライドショーの画像配列をXML化
・arrayWithContentsOfFile:(スライドショーの画像配列をXML化
・arrayWithObjects:(スライドショーのメソッド(1)
・count(スライドショーのメソッド(1)
・indexOfObject:(メモ帳の作成(7)~設定値の保存
・objectAtIndex:(スライドショーの画像配列をXML化


●NSCalendarクラスクロックでカレンダーを指定する
・initWithCalendarIdentifier:


●NSDateクラスクロックの使用しているクラス
・date(スライドショーのメソッド(1)
・timeIntervalSinceReferenceDate(スライドショーのメソッド(1)


●NSDateFormatterクラスクロックの使用しているクラス
・init(クロックのメソッド
・NSDateFormatterStyle(クロックのメソッド
・setCalendar:(クロックでカレンダーを指定する
・setDateFormat:(クロックでカレンダーを指定する
・setDateStyle:(クロックのメソッド
・setLocale:(クロックでロケールを指定する
・setTimeStyle:(クロックのメソッド
・stringFromDate:(クロックのメソッド


●NSDictionaryクラス『基礎からのiPhone SDK改訂版』おまけ
・dictionaryWithObjectsAndKeys:(メモ帳の作成(7)~設定値の保存


●NSLocaleクラス『基礎からのiPhone SDK改訂版』おまけ
・initWithLocaleIdentifier:(クロックでロケールを指定する
・NSLocale Calendar Keys(クロックでカレンダーを指定する


●NSMutableArrayクラススライドショーの使用しているクラス(2)
・addObject:(スライドショーの画像配列をXML化
・addObjectsFromArray:(メモ帳の作成(3)~フォント
・exchangeObjectAtIndex:withObjectAtIndex:(スライドショーのメソッド(1)


●NSNotificationクラス音楽プレイヤで使用しているクラス
・name(音楽プレイヤのメソッド(2)


●NSNotificationCenterクラス音楽プレイヤで使用しているクラス
・addObserver:selector:name:object:(音楽プレイヤのメソッド(1)
・defaultCenter(音楽プレイヤのメソッド(1)
・removeObserver:(音楽プレイヤのメソッド(2)


●NSObjectクラスフルスクリーン化で使用しているクラス(3)
・awakeFromNib(スライドショーのメソッド(2)
・init(クロックに独自クラスを導入する(2)
・performSelector:withObject:afterDelay:(スライドショーのフルスクリーン化(2)


●NSSetクラスフルスクリーン化で使用しているクラス(2)
・anyObject(スライドショーのフルスクリーン化(2)


●NSTimerクラスクロックの使用しているクラス
・invalidate(トランジションアニメーション(1)
・setFireDate:(クロックに時報を追加する


●NSTimeZoneクラスクロックに独自クラスを導入する(1)
・abbreviationDictionary(クロックに独自クラスを導入する(5)
・systemTimeZone(クロックに独自クラスを導入する(2)
・timeZoneWithAbbreviation:(クロックに独自クラスを導入する(5)


●NSURLクラス『基礎からのiPhone SDK改訂版』おまけ
・absoluteString(ウェブブラウザのデリゲート
・fileURLWithPath:(クロックに時報を追加する
・URLWithString:(ウェブブラウザのアクションメソッド


●NSURLProtectionSpaceクラス『基礎からのiPhone SDK改訂版』おまけ
・host(ウェブブラウザのデリゲート


●NSURLRequestクラス『基礎からのiPhone SDK改訂版』おまけ
・requestWithURL:(ウェブブラウザのアクションメソッド
・URL(ウェブブラウザのデリゲート


●NSUserDefaultsクラスメモ帳の作成(7)~設定値の保存
・integerForKey:
・registerDefaults:
・setObject:forKey:
・standardUserDefaults
・stringForKey:



参考文献

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

『基礎からのiPhone SDK改訂版』まとめ(1)

2010. 07. 28
これまで勉強してきた『基礎からのiPhone SDK 改訂版』についてのまとめです。

本書と当サイトの記事の関係は以下の通りです。

本書の章立てと当ブログのまとめ方が異なるので、細かい章や節には対応していません。

CHAPTER 01
iPhone OS/iPhone SDK概要
-
CHAPTER 02
iPhone OS機能カタログ
-
CHAPTER 03
初めてのアプリケーション開発

270
『基礎からのiPhone SDK改訂版』を始めてみた
 
CHAPTER 04
Objective-C入門
−ウェブブラウザ基礎編−

271
ウェブブラウザの作成
ウェブブラウザの使用しているクラス
ウェブブラウザのアクションメソッド
UIApplicationDelegateプロトコル
UIWebViewDelegateプロトコル
ウェブブラウザのデリゲート
ウェブブラウザのサンプルコードの補足
CHAPTER 05
メモリ管理
−デジタル時計の作成−

335
言語環境の用語
言語環境の言語
言語環境の書式
クロックの作成
クロックの使用しているクラス
クロックのメソッド
クロックでロケールを指定する
クロックでカレンダーを指定する
日付フォーマットのパターン
Core Audioの復習
クロックに時報を追加する
クロックに独自クラスを導入する(1)
クロックに独自クラスを導入する(2)
クロックに独自クラスを導入する(3)
クロックに独自クラスを導入する(4)
クロックに独自クラスを導入する(5)
クロックに独自クラスを導入する(6)
CHAPTER 06
ビューとイベント
−スライドショーの作成−

397
スライドショーの作成
スライドショーの使用しているクラス(1)
スライドショーの使用しているクラス(2)
スライドショーのメソッド(1)
スライドショーのメソッド(2)
スライドショーのメソッド(3)
スライドショーの画像配列をXML化
スライドショーのフルスクリーン化(1)
スライドショーのフルスクリーン化(2)
フルスクリーン化で使用しているクラス(1)
フルスクリーン化で使用しているクラス(2)
フルスクリーン化で使用しているクラス(3)
スライドショーの簡易アニメーション(1)
スライドショーの簡易アニメーション(2)
スライドショーの簡易アニメーション(3)
トランジションアニメーション(1)
トランジションアニメーション(2)
トランジションアニメーション(3)
トランジションアニメーション(4)
自前トランジション
CHAPTER 07
設定とローカライズ
−メモ帳の作成−

474
メモ帳の作成(1)
メモ帳の作成(2)~テキストビュー
メモ帳の作成(3)~フォント
メモ帳の作成(4)~ピッカービュー
メモ帳の作成(5)~アクションシート
メモ帳の作成(6)~アラート
メモ帳の作成(7)~設定値の保存
メモ帳の作成(8)~ローカライズ
CHAPTER 08
iPodライブラリアクセス+音楽プレイヤー

553
音楽プレイヤの作成
音楽プレイヤで使用しているクラス
音楽プレイヤのメソッド(1)
音楽プレイヤのメソッド(2)
アプリケーション音楽プレイヤ
検索条件によるクエリの絞り込み
指定したプレイリストの再生


●『基礎からのiPhone SDK改訂版』総評

『基礎からのiPhone SDK改訂版』を始めてみた』でも書きましたが、統合開発環境とC言語を扱っているのが前提とはいえ、『iPhone SDKの教科書』で勉強されている方はすんなり入れる内容です。

序盤は事細かに解説されていて親切ですが、それだけに『CHAPTER 07 設定とローカライズ
−メモ帳の作成−』のサンプルコードが別物で参考にならない点や、終盤の細かい説明が端折られている点が気になります。
(その辺を自分で補えるようになっていないとダメだと言われればそれまでですが・・・)

『CHAPTER 06 ビューとイベント−スライドショーの作成−』のトランジションアニメーションに関しては、SDKのバージョンアップにより古い内容になっているので注意してください。
(対策は『トランジションアニメーション(2)』を参照してください)

細かい不備はありますが、人にお勧めできる良書です。



参考文献

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

指定したプレイリストの再生

2010. 07. 27
最後にプレイリスト名を指定した再生をしてみます。

599


●指定されたプレイリスト名をキューに登録

プレイリスト名を引数として受け取り、デバイスのクエリ中の全プレイリストと照合して、合致した場合にキューに登録します。

awakeFromNibメソッドの前に、指定されたプレイリスト名をキューに登録するsetQueueWithPlaylist:メソッドを追加します。

- (void)setQueueWithPlaylist:(NSString *)name {
    // プレイリストでグループ化するクエリを生成
    MPMediaQuery *query = [MPMediaQuery playlistsQuery];

    // 曲の一覧を取得
    NSArray *playlists = query.collections;

    // 全てのグループについてプレイリスト名を比較
    for (MPMediaPlaylist *playlist in playlists) {
        // プレイリスト名を取得
        NSString *plName = [playlist valueForProperty:MPMediaPlaylistPropertyName];

        // プレイリスト名が一致したら、キューに登録
        if ([plName isEqualToString:name]) {
            [player setQueueWithItemCollection:playlist];
            break;
        }
    }
}

600


・playlistsQuery
(MPMediaQueryクラス)

+ (MPMediaQuery *)playlistsQuery

プレイリスト名で適合するiPodライブラリとグループ、ソートコレクションによるメディアクエリを生成します。

戻り値は、適合する全てのメディアアイテムとMPMediaGroupingPlaylistのグルーピングタイプのメディアクエリです。


・collections
(MPMediaQueryクラス)

@property (nonatomic, readonly) NSArray *collections;

クエリのメディアプロパティ述語と適合するアイテムを含む、メディアアイテムコレクションの配列です。

メディアクエリのgroupingTypeでソートされた、グループ化されたコレクションの配列を返します。

このプロパティを使ったコードを以下に示します。

// メディアクエリの指定:
// メディアプロパティ述語を含まないため、iPodライブラリ全体になります
MPMediaQuery *everything = [[MPMediaQuery alloc] init];


// メディアクエリにメディアアイテムのグループを構成:ここではアーティストでグループ化
[everything setGroupingType: MPMediaGroupingArtist];


// キューからメディアアイテムコレクションの取得
NSArray *collections = [everything collections];

collections配列の各要素は、現在メディアアイテムコレクションが含まれます。

各コレクションは、特定のアーティストによるiPodライブラリのメディアアイテムが含まれます。

配列の要素はアーティスト名でソートされています。

使用できるグループタイプはについては『Media Item Collection Grouping Keys』を参照してください。


・valueForProperty
(MPMediaPlaylistクラス)

- (id)valueForProperty:(NSString *)property

指定したプレイリストのプロパティキーの値を取得します。

戻り値は、メディアアイテムのpropertyキーの値を返します。

詳細は『Property Keys』を参照してください。

property:対応する値を取得するためのプロパティキーを指定します。


・Playlist Property Keys
(MPMediaPlaylistクラス)

これらのキーをcanFilterByProperty:やvalueForProperty:メソッドで使うと、プレイリストに関する情報を取得できます。

『filterable』と示しているプロパティは、メディアプロパティ述語の構築に使用することができます。
(詳細は『MPMediaPropertyPredicate Class Reference』を参照)

NSString*constMPMediaPlaylistPropertyPersistentID;// Filterable
NSString*constMPMediaPlaylistPropertyName;// Filterable
NSString*constMPMediaPlaylistPropertyPlaylistAttributes;// Filterable
NSString*constMPMediaPlaylistPropertySeedItems; 

MPMediaPlaylistPropertyPersistentID
プレイリストの永続的な識別子です。
値はuint64_t(unsigned long long)のNSNumberオブジェクトです。
メディアプロパティ述語の構築に使用することができます。
(詳細は『MPMediaQuery Class Reference』を参照してください)

MPMediaPlaylistPropertyName
プレイリストの名前です。
値はNSStringオブジェクトです。
メディアプロパティ述語の構築に使用することができます。
(詳細は『MPMediaQuery Class Reference』を参照してください)

MPMediaPlaylistPropertyPlaylistAttributes
プレイリストに関連付けされた属性です。
値はNSIntegerデータ型のNSNumberオブジェクトです。
プレイリストの属性はNSIntegerのフィールドで識別します。
プレイリストにはいくつかの属性の組み合わせが有り、詳細は『Playlist Attribute Flags』を参照してください。
メディアプロパティ述語の構築に使用することができます。
(詳細は『MPMediaQuery Class Reference』を参照してください)

MPMediaPlaylistPropertySeedItems
プレイリストを生成するアイテムのシード(種)で、Geniusプレイリストでのみ適用されます。
値は一つ以上のMPMediaItemオブジェクトを含むNSArrayオブジェクトです。
MPMediaPlaylistAttributeGeniusフラグを設定していない場合、プレイリストの値はnilになります。


・setQueueWithItemCollection:
(MPMusicPlayerControllerクラス)

- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection

メディアアイテムコレクションを使って、音楽プレイヤの再生キューに設定します。

再生キューが確立された後で、playを呼び出して再生を開始します。

itemCollection:再生キューに必要なメディアアイテムコレクションを指定します。
メディアアイテムコレクションとその使い方については『MPMediaItemCollection Class Reference』を参照してください。


●awakeFromNibからの呼び出し

awakeFromNibメソッドからsetQueueWithPlaylist:メソッドを呼び出すように修正します。
(太字が修正した部分)

- (void)awakeFromNib {
    // スーパークラスによる初期化
    [super awakeFromNib];

    // アプリケーション自身で音楽再生を行う
    player = [MPMusicPlayerController applicationMusicPlayer];

    [self setQueueWithPlaylist:@"ミンゴス"];

    // 音楽再生
    player.repeatMode = MPMusicRepeatModeAll;    // 全曲リピートに設定
    player.shuffleMode = MPMusicShuffleModeOff;    // シャッフル無しに設定
    [player play];    // 再生開始

    // 制御パネルの表側を貼り付ける
    [viewPlace addSubview:viewMainSide];

    // 現在再生中の曲の情報を画面に表示する
    [self updateView];

    // 通知センターのインスタンスを取得
    NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];

    // 再生曲が変化した時の通知先を登録
    [noteCenter addObserver:self selector:@selector(didItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:player];

    // 通知の開始を指示
    [player beginGeneratingPlaybackNotifications];
}

601

プレイリスト名として『ミンゴス』と指定して、setQueueWithPlaylist:メソッドを呼び出しています。

該当するプレイリスト名が無い場合は再生されません。

602



参考文献

MPMediaQuery Class Reference

MPMediaPlaylist Class Reference

MPMusicPlayerController Class Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

検索条件によるクエリの絞り込み

2010. 07. 27
クエリは全ての音楽アイテムを並べ替えして拾ってくるだけですので、検索条件を与えて絞り込みを行ってみます。

597

今回は特定のアーティスト名のピックアップを行ってみます。
(太字が追加した部分)

- (void)awakeFromNib {
    // スーパークラスによる初期化
    [super awakeFromNib];

    // アプリケーション自身で音楽再生を行う
    player = [MPMusicPlayerController applicationMusicPlayer];

    // アーティスト名順のクエリを生成
    MPMediaQuery *query = [MPMediaQuery artistsQuery];

    // コンソールにクエリを出力
    NSLog(@"アーティスト名順のクエリを生成");
    [self printMediaQuery:query];

    // 検索条件の生成
    MPMediaPropertyPredicate *pred;

    pred = [MPMediaPropertyPredicate predicateWithValue:@"絵理" forProperty:MPMediaItemPropertyArtist comparisonType:MPMediaPredicateComparisonContains];

    // 検索条件をクエリに追加
    [query addFilterPredicate:pred];

    // コンソールにクエリを出力
    NSLog(@"検索条件をクエリに追加");
    [self printMediaQuery:query];

    // クエリを音楽プレイヤにセット
    [player setQueueWithQuery:query];

    // コンソールにクエリを出力
    NSLog(@"クエリを音楽プレイヤにセット");
    [self printMediaQuery:query];

    // 音楽再生
    player.repeatMode = MPMusicRepeatModeAll;    // 全曲リピートに設定
    player.shuffleMode = MPMusicShuffleModeOff;    // シャッフル無しに設定
    [player play];    // 再生開始

    // 制御パネルの表側を貼り付ける
    [viewPlace addSubview:viewMainSide];

    // 現在再生中の曲の情報を画面に表示する
    [self updateView];

    // 通知センターのインスタンスを取得
    NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];

    // 再生曲が変化した時の通知先を登録
    [noteCenter addObserver:self selector:@selector(didItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:player];

    // 通知の開始を指示
    [player beginGeneratingPlaybackNotifications];
}

598

ログは下記のようになります。
(比較し難いので頭の『Artist, Album, Title =』とアルバム名の『THE IDOLM@STER』は端折っています)

アーティスト名順のクエリを生成

たかはし智秋, RADIO 歌道場, そばにいるね
たかはし智秋, RADIO TOP×TOP! [Disc 1], BEST ROAD
たかはし智秋, RADIO VOCAL MASTER, destiny
たかはし智秋, RADIO 歌姫楽園, STYLISH QUEEN★
たかはし智秋, RADIO LONG TIME, sunshine
(中略)
萩原雪歩 (落合祐里香) & 四条貴音 (原由実), MASTER SPECIAL 04, shiny smile (REM@STER-B)
萩原雪歩 (落合祐里香), 菊地真 (平田宏美), BEST ALBUM ~MASTER OF MASTER~ [Disc 2], First Stage (M@STER VERSION)
萩原雪歩 (落合祐里香), 三浦あずさ (たかはし智秋), 水瀬伊織 (釘宮理恵), 秋月律子 (若林直美), 双海亜美 / 真美 (下田麻美), BEST ALBUM ~MASTER OF MASTER~ [Disc 1], サニー
萩原雪歩 (落合祐里香), 秋月律子 (若林直美), 高槻やよい (仁後真耶子), BEST ALBUM ~MASTER OF MASTER~ [Disc 2], My Best Friend (M@STER VERSION)
平田宏美, 今井麻美, たかはし智秋, RADIO 歌道場, ベルサイユのばら ~薔薇は美しく散る~

検索条件をクエリに追加

水谷絵理 (花澤香菜), DREAM SYMPHONY 01, クロスワード
水谷絵理 (花澤香菜), BEST OF 765+876=!! Vol. 01, プリコグ (M@STER VERSION)
水谷絵理 (花澤香菜), DREAM SYMPHONY 01, プリコグ (M@STER VERSION)
水谷絵理 (花澤香菜), DREAM SYMPHONY 01, "Hello!!" (M@STER VERSION)
水谷絵理 (花澤香菜), DREAM SYMPHONY 01, 思い出をありがとう (M@STER VERSION)
水谷絵理 (花澤香菜), DREAM SYMPHONY 01, 魔法をかけて! (M@STER VERSION)
日高愛 (戸松遥), 水谷絵理 (花澤香菜), 秋月涼 (三瓶由布子), BEST OF 765+876=!! Vol. 02, ハッピース
日高愛 (戸松遥), 水谷絵理 (花澤香菜), 秋月涼 (三瓶由布子), DREAM SYMPHONY 00 "HELLO!!", ハッピース
日高愛 (戸松遥), 水谷絵理 (花澤香菜), 秋月涼 (三瓶由布子), BEST OF 765+876=!! Vol. 02, "HELLO!!" (M@STER VERSION)
日高愛 (戸松遥), 水谷絵理 (花澤香菜), 秋月涼 (三瓶由布子), DREAM SYMPHONY 00 "HELLO!!", "HELLO!!" (M@STER VERSION)
如月千早 (今井麻美), 三浦あずさ (たかはし智秋), 水瀬伊織 (釘宮理恵), 双海亜美 / 真美 (下田麻美), 水谷絵理 (花澤香菜), BEST OF 765+876=!! Vol. 03, LOST

クエリを音楽プレイヤにセット

水谷絵理 (花澤香菜), DREAM SYMPHONY 01, クロスワード
日高愛 (戸松遥), 水谷絵理 (花澤香菜), 秋月涼 (三瓶由布子), BEST OF 765+876=!! Vol. 02, ハッピース
日高愛 (戸松遥), 水谷絵理 (花澤香菜), 秋月涼 (三瓶由布子), DREAM SYMPHONY 00 "HELLO!!", ハッピース
水谷絵理 (花澤香菜), BEST OF 765+876=!! Vol. 01, プリコグ (M@STER VERSION)
水谷絵理 (花澤香菜), DREAM SYMPHONY 01, プリコグ (M@STER VERSION)
水谷絵理 (花澤香菜), DREAM SYMPHONY 01, "Hello!!" (M@STER VERSION)
日高愛 (戸松遥), 水谷絵理 (花澤香菜), 秋月涼 (三瓶由布子), BEST OF 765+876=!! Vol. 02, "HELLO!!" (M@STER VERSION)
日高愛 (戸松遥), 水谷絵理 (花澤香菜), 秋月涼 (三瓶由布子), DREAM SYMPHONY 00 "HELLO!!", "HELLO!!" (M@STER VERSION)
如月千早 (今井麻美), 三浦あずさ (たかはし智秋), 水瀬伊織 (釘宮理恵), 双海亜美 / 真美 (下田麻美), 水谷絵理 (花澤香菜), BEST OF 765+876=!! Vol. 03, LOST
水谷絵理 (花澤香菜), DREAM SYMPHONY 01, 思い出をありがとう (M@STER VERSION)
水谷絵理 (花澤香菜), DREAM SYMPHONY 01, 魔法をかけて! (M@STER VERSION)

名前順のソートは、
・平仮名/カタカナ
・英字
・数字
・漢字
の順に行われます。

最初にアーティスト名順のクエリを生成し、アーティスト名『絵理』の部分一致(MPMediaPredicateComparisonContains)の条件をクエリに追加して絞り込みを行っています。

完全一致(MPMediaPredicateComparisonEqualTo)で絞り込みを行う際、例えば『水谷絵理 (花澤香菜)』とライブラリに登録されている場合、『水谷絵理 花澤香菜』と半角括弧を全角括弧にしたり『水谷絵理(花澤香菜)』と途中の半角スペースを抜いたりすると検索に引っかからないので注意が必要です。

ユーザに絞り込みをさせる場合には、表記揺れを考慮した工夫が必要になるかもしれません。

抽出された結果を音楽プレイヤにセットすると、曲名順にソートされます。


・predicateWithValue:forProperty:comparisonType:
(MPMediaPropertyPredicateクラス)

+ (MPMediaPropertyPredicate *)predicateWithValue:(id)value forProperty:(NSString *)property comparisonType:(MPMediaPredicateComparison)comparisonType

比較タイプを指定した、メディアプロパティ述語を生成して返します。

value:iPodライブラリのクエリで一致する、必要なプロパティ値を指定します。
例えば、propertyパラメータでMPMediaItemPropertyArtist定数を指定した場合、このパラメータはアーティスト名を含む文字列を指定します。

property:フィルタプロパティとも呼び、メディアプロパティ述語の構築に使用することができます。
MPMediaItem Class Reference』の『General Media Item Property Keys』と『Podcast Item Property Keys』を参照してください。

comparisonType:述語の論理比較タイプを指定します。
Media Property Predicate Comparison Types』を参照してください。


・Media Property Predicate Comparison Types
(MPMediaPropertyPredicateクラス)

メディアクエリの論理比較タイプです。

enum {
    MPMediaPredicateComparisonEqualTo,
    MPMediaPredicateComparisonContains
};
typedef NSInteger MPMediaPredicateComparison;

MPMediaPredicateComparisonEqualTo
メディアプロパティ述語内の値と、プロパティで与えたメディアアイテムの値が一致した場合。

MPMediaPredicateComparisonContains
メディアプロパティ述語の値の中に、一致するプロパティで与えたメディアアイテムの値が含まれる場合。


・addFilterPredicate:
(MPMediaQueryクラス)

- (void)addFilterPredicate:(MPMediaPredicate *)predicate

クエリにメディアプロパティ述語を追加します。

predicate:クエリに述語を追加設定するためのメディア述語を指定します。


●MPMediaPropertyPredicateクラス

MPMediaPropertyPredicateオブジェクトまたはメディアプロパティ述語は一つ以上使用して、iPodライブラリからメディアアイテムのサブセットを取得し、メディアクエリ内にフィルタを定義します。

このコンテキスト内の述語で、必要とする論理的な表現を条件に、各メディアアイテムに対して検査します。

条件を満たしたアイテムは、クエリの結果として取得されます。

iPodライブラリのクエリの定義とクエリ結果の取得には、『MPMediaQuery Class Reference』で説明されているMPMediaQueryクラスを使用してください。

クエリで取得するメディアアイテムとメディアアイテムコレクションについては、『MPMediaItem Class Reference』と『MPMediaItemCollection Class Reference』を参照してください。



参考文献

MPMediaPropertyPredicate Class Reference

MPMediaQuery Class Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

アプリケーション音楽プレイヤ

2010. 07. 26
●アプリケーション音楽プレイヤへの改造

音楽プレイヤで使用しているクラス』の『MPMusicPlayerControllerクラス』の説明にある『iPod音楽再生プレイヤ』から『アプリケーション音楽プレイヤ』に変更してみます。
(太字が追加・修正した部分)

- (void)awakeFromNib {
    // スーパークラスによる初期化
    [super awakeFromNib];

    // アプリケーション自身で音楽再生を行う
    player = [MPMusicPlayerController applicationMusicPlayer];

    // アーティスト名順のクエリを生成
    MPMediaQuery *query = [MPMediaQuery artistsQuery];

    // クエリを音楽プレイヤにセット
    [player setQueueWithQuery:query];

    // 音楽再生
    player.repeatMode = MPMusicRepeatModeAll;    // 全曲リピートに設定
    player.shuffleMode = MPMusicShuffleModeOff;    // シャッフル無しに設定
    [player play];    // 再生開始

    // 制御パネルの表側を貼り付ける
    [viewPlace addSubview:viewMainSide];

    // 現在再生中の曲の情報を画面に表示する
    [self updateView];

    // 通知センターのインスタンスを取得
    NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];

    // 再生曲が変化した時の通知先を登録
    [noteCenter addObserver:self selector:@selector(didItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:player];

    // 通知の開始を指示
    [player beginGeneratingPlaybackNotifications];
}

593

本書中、albumsQuery、artistsQuery、composersQueryの記述が単数系のalbumQuery、artistQuery、composerQueryと誤記されているので注意してください。
(『08-13 アーチスト名順の音楽再生の方法(PanelController.m)』コード中も含む)


・applicationMusicPlayer
(MPMusicPlayerControllerクラス)

+ (MPMusicPlayerController *)applicationMusicPlayer

アプリケーション音楽プレイヤを返します。

アプリケーション音楽プレイヤは、アプリケーション内のローカルで音楽を再生します。

iPodの状態には影響しません。

アプリケーションが終了すると音楽の再生を停止します。


・artistsQuery
(MPMediaQueryクラス)

+ (MPMediaQuery *)artistsQuery

アーティスト名で適合する音楽アイテムとグループ、ソートコレクションによるメディアクエリを生成します。

戻り値は、適合するMPMediaTypeMusicのメディアアイテムとMPMediaGroupingArtistのグルーピングタイプのメディアクエリです。

メディアアイテムは、『music』と『podcast』といった一つ以上のメディアタイプを持ちます。

artistsQueryクエリは全てのMPMediaTypeMusicアイテムに適合し、必ず他のメディアタイプにも属します。


・setQueueWithQuery:
(MPMusicPlayerControllerクラス)

- (void)setQueueWithQuery:(MPMediaQuery *)query

音楽プレイヤの再生キューをメディアクエリに基づいて設定します。

再生キューが確立された後で、playを呼び出して再生を開始します。

query:再生キューに必要なメディアアイテムのコレクションを指定するメディアクエリです。
クエリのタイプと生成については『MPMediaQuery Class Reference』を参照してください。


実行結果は下図のようになります。

594

実行環境によってはすぐに気付くと思いますが、アーティスト名順でクエリを生成しているはずなのに、再生順がアーティスト名順ではなく曲名順になっています。

この件については確認の方法を後述します。


●MPMediaQueryクラス

MPMediaQueryオブジェクトまたはメディアクエリは、iPodライブラリからフィルタとグルーピングをしたメディアアイテムの設定を行います。

どちらもオプションで、クエリを指定しない場合はライブラリに登録されている全てになります。

クエリはグルーピングタイプを一つ持つ必要があります。

クエリのフィルタはいくつかのメディアプロパティ述語を構成することができます。

フィルタを使った構築のメソッドについては『MPMediaPropertyPredicate Class Reference』をプロパティキーの基礎については『MPMediaItem Class Reference』を参照してください。

クエリの生成と構成が終わったら、メディアアイテムまたはメディアアイテムのコレクションの取得に使用します。

コレクションについては『MPMediaItemCollection Class Reference』を参照してください。

このクラスはグルーピングタイプを適用する便利なコンストラクタを含んでおり、ほとんどの場合iPodライブラリのサブセットと適合します。

表1にコンストラクタの特徴を要約します。

フィルタについては『MPMediaItem Class Reference』を参照してください。

グルーピングタイプについては『Media Item Collection Grouping Keys』を参照してください。

表1 MPMediaQueryクラスの便利なコンストラクタ

コンストラクタ名iPodライブラリ
との一致
フィルタグルーピングタイプ
albumsQuery-MPMediaTypeMusicMPMediaGroupingAlbum
artistsQuery-MPMediaTypeMusicMPMediaGroupingArtist
audiobooksQuery-MPMediaTypeAudioBookMPMediaGroupingTitle
compilationsQuery-MPMediaTypeAny with
MPMediaItemPropertyIsCompilation
MPMediaGroupingAlbum
composersQueryYesMPMediaTypeAnyMPMediaGroupingComposer
genresQueryYesMPMediaTypeAnyMPMediaGroupingGenre
playlistsQueryYesMPMediaTypeAnyMPMediaGroupingPlaylist
podcastsQuery-MPMediaTypePodcastMPMediaGroupingPodcastTitle
songsQuery-MPMediaTypeMusicMPMediaGroupingTitle


●クエリから得られる曲の一覧の取得

クエリ内の曲の内容を調べる(コンソールに出力する)メソッドが本書内に紹介されているので、曲順のデバッグに利用してみます。
(出力されるログからジャンルを端折っています)

awakeFromNibメソッドの前に、クエリ出力メソッドprintMediaQuery:を追加します。

- (void)printMediaQuery:(MPMediaQuery *)query {
    // グループの配列を取得
    NSArray *cols = query.collections;

    // 全グループに対して実行
    for (MPMediaItemCollection *col in cols) {
        // グループ内の曲の配列を取得
        NSArray *items = col.items;

        // 全曲に対して実行
        for (MPMediaItem *item in items) {
            // コンソールに対して出力
            NSLog(@"Artist, Album, Title = %@, %@, %@",
                [item valueForProperty:MPMediaItemPropertyArtist],
                [item valueForProperty:MPMediaItemPropertyAlbumTitle],
                [item valueForProperty:MPMediaItemPropertyTitle]);
        }
    }
}

595

そしてawakeFromNibメソッドからprintMediaQuery:を呼び出します。
(太字が追加した部分)

- (void)awakeFromNib {
    // スーパークラスによる初期化
    [super awakeFromNib];

    // アプリケーション自身で音楽再生を行う
    player = [MPMusicPlayerController applicationMusicPlayer];

    // アーティスト名順のクエリを生成
    MPMediaQuery *query = [MPMediaQuery artistsQuery];

    // コンソールにクエリを出力
    NSLog(@"アーティスト名順のクエリを生成");
    [self printMediaQuery:query];

    // クエリを音楽プレイヤにセット
    [player setQueueWithQuery:query];

    // コンソールにクエリを出力
    NSLog(@"クエリを音楽プレイヤにセット");
    [self printMediaQuery:query];

    // 音楽再生
    player.repeatMode = MPMusicRepeatModeAll;    // 全曲リピートに設定
    player.shuffleMode = MPMusicShuffleModeOff;    // シャッフル無しに設定
    [player play];    // 再生開始

    // 制御パネルの表側を貼り付ける
    [viewPlace addSubview:viewMainSide];

    // 現在再生中の曲の情報を画面に表示する
    [self updateView];

    // 通知センターのインスタンスを取得
    NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];

    // 再生曲が変化した時の通知先を登録
    [noteCenter addObserver:self selector:@selector(didItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:player];

    // 通知の開始を指示
    [player beginGeneratingPlaybackNotifications];
}

クエリの生成直後とクエリを音楽プレイヤにセットした後に、クエリ出力メソッドを追加しました。

コンソールは、Xcodeの『実行』メニュー内の『コンソール』で開くことができます。

iPodの登録曲数が多いとログ出力に時間がかかりますので、(入れ直しに手間がかかりますが)デバッグ時にプレイリストを曲数の少ないものと入れ替えて本体から一度削除するか、気長に待つ必要があります。

アーティスト名順でのクエリの出力例は以下のようになります。
(比較し難いので頭の『Artist, Album, Title =』とアルバム名の『THE IDOLM@STER』は端折っています)

アーティスト名順のクエリを生成

我那覇響 (沼倉愛美), MASTER SPECIAL 03, オーバーマスター (M@STER VERSION)
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Is This Love
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Next Life
如月千早 (今井麻美), MASTER SPECIAL 03, arcadia
如月千早 (今井麻美), MASTER SPECIAL 03, inferno
如月千早 (今井麻美), MASTER SPECIAL 03, 遠い音楽
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, Do-Dai (REM@STER-B)
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, L・O・B・M

クエリを音楽プレイヤにセット

我那覇響 (沼倉愛美), MASTER SPECIAL 03, オーバーマスター (M@STER VERSION)
如月千早 (今井麻美), MASTER SPECIAL 03, arcadia
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, Do-Dai (REM@STER-B)
如月千早 (今井麻美), MASTER SPECIAL 03, inferno
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Is This Love
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, L・O・B・M
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Next Life
如月千早 (今井麻美), MASTER SPECIAL 03, 遠い音楽

ご覧のように、クエリ生成直後はアーティスト名順となっていますが、音楽プレイヤにセットすると曲順に入れ替わってしまいます。

この現象はアーティスト名(artistsQuery)だけではなく他のメソッドでも同様で、音楽プレイヤにセットすると曲順に入れ替わります。

albumsQuery(アルバム名順)、compilationsQuery(コンピレーション名順)

如月千早 (今井麻美), MASTER SPECIAL 03, arcadia
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Next Life
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Is This Love
如月千早 (今井麻美), MASTER SPECIAL 03, 遠い音楽
如月千早 (今井麻美), MASTER SPECIAL 03, inferno
我那覇響 (沼倉愛美), MASTER SPECIAL 03, オーバーマスター (M@STER VERSION)
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, Do-Dai (REM@STER-B)
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, L・O・B・M

songsQuery(曲名順)では、セット前後で内容は変わりません。

またメディアアイテムに登録されていない情報でクエリを生成したりすると、音楽プレイヤの設定時にタイムアウトしてアプリケーションが戻って来なくなりますので注意が必要です。

playlistsQuery(プレイリスト名順)

プレイリスト名順のクエリを生成

如月千早 (今井麻美), ASTER SPECIAL 03, arcadia
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Next Life
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Is This Love
如月千早 (今井麻美), MASTER SPECIAL 03, 遠い音楽
如月千早 (今井麻美), MASTER SPECIAL 03, inferno
我那覇響 (沼倉愛美), MASTER SPECIAL 03, オーバーマスター (M@STER VERSION)
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, Do-Dai (REM@STER-B)
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, L・O・B・M

クエリを音楽プレイヤにセット

MediaPlayer: Message collectionsForQuery: timed out.
MediaPlayer: Message collectionsForQuery:inRange: timed out.

podcastsQuery(ポッドキャスト名順)、composersQuery(作曲者名順)

*****名順のクエリを生成

クエリを音楽プレイヤにセット

MediaPlayer: Message collectionsForQuery: timed out.
MediaPlayer: Message collectionsForQuery:inRange: timed out.

audiobooksQuery(オーディオブック名順)

オーディオブック名順のクエリを生成

Unable to send CPDistributedMessagingCenter message named setQueueWithQuery:firstItem: to com.apple.MPMusicPlayerControllerInternal: (ipc/send) timed out

クエリを音楽プレイヤにセット

genresQuery(ジャンル名順)

ジャンル名順のクエリを生成

我那覇響 (沼倉愛美), MASTER SPECIAL 03, オーバーマスター (M@STER VERSION)
如月千早 (今井麻美), MASTER SPECIAL 03, arcadia
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, Do-Dai (REM@STER-B)
如月千早 (今井麻美), MASTER SPECIAL 03, inferno
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Is This Love
如月千早 (今井麻美) & 我那覇響 (沼倉愛美), MASTER SPECIAL 03, L・O・B・M
我那覇響 (沼倉愛美), MASTER SPECIAL 03, Next Life
如月千早 (今井麻美), MASTER SPECIAL 03, 遠い音楽

クエリを音楽プレイヤにセット

MediaPlayer: Message collectionsForQuery: timed out.
MediaPlayer: Message collectionsForQuery:inRange: timed out.


●setQueueWithQuery:でクエリの順序が変わる理由

クエリはあくまで検索した結果を返すだけでソート内容の保持はしておらず、ソート内容を保持した出力結果を得るにはコレクションにする必要があるようです。

本書内でも『グループというのは「曲が入っているフォルダ」と捉えるとわかりやすいかもしれません』とあるように、クエリは検索した結果としてその場ではソートされているものの、キューに登録される際には(順序を持たない)フォルダとして渡されるため、順序が(デフォルトの)曲順にソートされてしまうのだと思われます。

しかしクエリをコレクションにしてsetQueueWithItemCollection:にセットしても、『MediaPlayer: Message nowPlayingItem timed out.』というメッセージがコンソールに出力されて再生できません。

setQueueWithQuery:が1曲再生であるのに対し、setQueueWithItemCollection:は複数曲再生に対応しているせいか、単にキューに渡すだけではなく、その中でどの曲を再生するのかを指定しなければならない気がします。

iPodライブラリアクセスプログラミングガイド』の『再生キューの設定』のコード内のコメント分に『コレクションをミュージックプレーヤーの再生キューに追加する、ただしユーザが再生する曲を少なくとも1つ選んだ場合に限る』と書かれており、曲指定がなされていないためにnowPlayingItemがタイムアウトしていると思われます。

ちなみに、コレクションを試したコードは下記の通りです。
(再生せずに応答不能になるので注意)
(太字が追加・修正した部分)

- (void)awakeFromNib {
    // スーパークラスによる初期化
    [super awakeFromNib];

    // アプリケーション自身で音楽再生を行う
    player = [MPMusicPlayerController applicationMusicPlayer];

    // アーティスト名順のクエリを生成
    MPMediaQuery *query = [MPMediaQuery artistsQuery];

    // コンソールにクエリを出力
    NSLog(@"アーティスト名順のクエリを生成");
    [self printMediaQuery:query];

    NSArray *collection = [query collections];

    // クエリを音楽プレイヤにセット
    MPMediaItemCollection *miCollection = [MPMediaItemCollection collectionWithItems:collection];
    [player setQueueWithItemCollection:miCollection];

    // 音楽再生
    player.repeatMode = MPMusicRepeatModeAll;    // 全曲リピートに設定
    player.shuffleMode = MPMusicShuffleModeOff;    // シャッフル無しに設定
    [player play];    // 再生開始

    // 制御パネルの表側を貼り付ける
    [viewPlace addSubview:viewMainSide];

    // 現在再生中の曲の情報を画面に表示する
    [self updateView];

    // 通知センターのインスタンスを取得
    NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];

    // 再生曲が変化した時の通知先を登録
    [noteCenter addObserver:self selector:@selector(didItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:player];

    // 通知の開始を指示
    [player beginGeneratingPlaybackNotifications];
}

丸一日webや本で調べたり、色々試してもよく分からなかったので、保留にしておきます。



参考文献

MPMusicPlayerController Class Reference

MPMediaQuery Class Reference

iPodライブラリアクセスプログラミングガイド

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

音楽プレイヤのメソッド(2)

2010. 07. 24
●updateView

制御パネルに表示する項目を更新するメソッドです。

現在再生中の曲を取得し、そこから制御パネルの表面に表示する曲名、アルバム名、アーティスト名のプロパティを得て、アウトレットのラベルに反映させます。

また制御パネルの裏面に表示するアートワークも同時に取得し、反映させています。

- (void)updateView {
    // 現在再生中の曲を取得
    MPMediaItem *curItem = [player nowPlayingItem];

    // 曲情報の取得とビューへの反映(曲名/アルバム名/アーティスト名)
    labelSongTitle.text = [curItem valueForProperty:MPMediaItemPropertyTitle];
    labelAlbumTitle.text = [curItem valueForProperty:MPMediaItemPropertyAlbumTitle];
    labelArtist.text = [curItem valueForProperty:MPMediaItemPropertyArtist];

    // アートワークの取得とビューへの反映
    MPMediaItemArtwork *artWork;
    artWork = [curItem valueForProperty:MPMediaItemPropertyArtwork];
    imageArtWork.image = [artWork imageWithSize:imageArtWork.frame.size];
}

588


・nowPlayingItem
(MPMusicPlayerControllerクラス)

@property (nonatomic, copy) MPMediaItem *nowPlayingItem

現在再生中のメディアアイテム、再生していない場合はキュー内のメディアアイテムを指定して再生を開始します。

再生キュー内の特定のメディアアイテムで再生を開始する場合、このプロパティでそのアイテムを設定すると音楽プレイヤは停止または一時停止します。

再生中または再生を指定するメディアアイテムが無い場合、このプロパティの値はnilになります。


・valueForProperty
(MPMediaItemクラス)

- (id)valueForProperty:(NSString *)property

指定したメディアアイテムのプロパティキーの値です。

戻り値は、メディアアイテムのpropertyキーの値を返します。

このプロパティで使用可能なメタデータのキーのリストは、『General Media Item Property Keys』『Podcast Item Property Keys』『User-Defined Property Keys』です。

property:対応する値を取得するためのプロパティキーを指定します。


・General Media Item Property Keys
(MPMediaItemクラス)

これらのプロパティキーでvalueForPropertyメソッドを呼び出すことによって、メディアアイテムのメタデータを取得します。

いくつかのプロパティはメディアプロパティ述語の構築に使用することができます。
(詳細は『MPMediaPropertyPredicate Class Reference』を参照)

これらのプロパティには『filterable』と示しています。

NSString*constMPMediaItemPropertyPersistentID;// filterable
NSString*constMPMediaItemPropertyMediaType;// filterable
NSString*constMPMediaItemPropertyTitle;// filterable
NSString*constMPMediaItemPropertyAlbumTitle;// filterable
NSString*constMPMediaItemPropertyArtist;// filterable
NSString*constMPMediaItemPropertyAlbumArtist;// filterable
NSString*constMPMediaItemPropertyGenre;// filterable
NSString*constMPMediaItemPropertyComposer;// filterable
NSString*constMPMediaItemPropertyPlaybackDuration; 
NSString*constMPMediaItemPropertyAlbumTrackNumber; 
NSString*constMPMediaItemPropertyAlbumTrackCount; 
NSString*constMPMediaItemPropertyDiscNumber; 
NSString*constMPMediaItemPropertyDiscCount; 
NSString*constMPMediaItemPropertyArtwork; 
NSString*constMPMediaItemPropertyLyrics; 
NSString*constMPMediaItemPropertyIsCompilation;// filterable
NSString*constMPMediaItemPropertyReleaseDate; 
NSString*constMPMediaItemPropertyBeatsPerMinute; 
NSString*constMPMediaItemPropertyComments; 
NSString*constMPMediaItemPropertyAssetURL; 

MPMediaItemPropertyPersistentID
メディアアイテムの永続的な識別子です。
値はuint64_t(unsigned long long)のNSNumberオブジェクトです。
MPMediaItemPropertyPersistentID識別子の値は永続的なもので、アプリケーションの起動や同期に関わらず、メディアアイテムの同期状態で変更されません。
同期/非同期/同期サイクルを経て値が永続することは保証されません。
メディアプロパティ述語の構築に使用することができます。

MPMediaItemPropertyMediaType
メディアアイテムのメディアタイプです。
値はNSIntegerデータ型のNSNumberオブジェクトです。
NSInteger値は『Media Item Type Flags』のビットフィールドフラグまたはフラグのセットを表します。
メディアプロパティ述語の構築に使用することができます。

MPMediaItemPropertyTitle
メディアアイテムのタイトル(または名前)です。
このプロパティはMPMediaItemPropertyAlbumTitleプロパティと関連はありません。
値はNSStringオブジェクトです。
メディアプロパティ述語の構築に使用することができます。

MPMediaItemPropertyAlbumTitle
アルバムのタイトルです。
アルバムの個々の曲のタイトルは、MPMediaItemPropertyTitleプロパティを指定します。
値はNSStringオブジェクトです。
メディアプロパティ述語の構築に使用することができます。

MPMediaItemPropertyArtist
メディアアイテムの演奏するアーティストです。
メディアアイテムに属する名前なので、アルバムの主要なアーティストと異なる場合があります。
例えばアルバム『THE IDOLM@STER MASTER SPECIAL 04』のアーティストが『萩原雪歩 (落合祐里香) & 四条貴音 (原由実)』で、アルバムのその内の一曲『ALRIGHT*』のアーティストは『萩原雪歩 (落合祐里香)』という場合です。
値はNSStringオブジェクトです。
メディアプロパティ述語の構築に使用することができます。

MPMediaItemPropertyAlbumArtist
アルバムで主に演奏するアーティストです。
値はNSStringオブジェクトです。
メディアプロパティ述語の構築に使用することができます。

MPMediaItemPropertyGenre
ミュージカルまたは映画といったメディアアイテムのジャンルです。
値はNSStringオブジェクトです。
メディアプロパティ述語の構築に使用することができます。

MPMediaItemPropertyComposer
メディアアイテムのミュージカルの作曲家です。
値はNSStringオブジェクトです。
メディアプロパティ述語の構築に使用することができます。

MPMediaItemPropertyPlaybackDuration
メディアアイテムの再生時間です。
値は再生時間をNSTimeIntervalの秒単位で表したNSNumberオブジェクトです。

MPMediaItemPropertyAlbumTrackNumber
メディアアイテムがアルバムの一部の場合、メディアアイテムのトラック番号を表します。
値はNSUIntegerデータ型のNSNumberオブジェクトです。

MPMediaItemPropertyAlbumTrackCount
メディアアイテムが入っているアルバムのトラック数です。
値はNSUIntegerデータ型のNSNumberオブジェクトです。

MPMediaItemPropertyDiscNumber
メディアアイテムがマルチディスクアルバムの一部の場合、メディアアイテムのディスク番号を表します。
値はNSUIntegerデータ型のNSNumberオブジェクトです。

MPMediaItemPropertyDiscCount
メディアアイテムが入っているアルバムのディスク数です。
値はNSUIntegerデータ型のNSNumberオブジェクトです。

MPMediaItemPropertyArtwork
メディアアイテムのアートワーク画像です。
値はメディアアイテムの画像で詳細は『MPMediaItemArtwork Class Reference』を参照してください。

MPMediaItemPropertyLyrics
メディアアイテムの歌詞です。
値はNSStringオブジェクトです。

MPMediaItemPropertyIsCompilation
メディアアイテムがコンピレーションの一部かどうかをブール値で表し、コンピレーションの一部であればYES、そうでなければNOになります。
iTunesの『情報見る(Get Info)』ダイアログ内の『情報(Info)』タブにある、『コンピレーションの一部(Part of a compilation)』のチェックボックスに対応しています。
値はBOOLデータ型のNSNumberオブジェクトです。

MPMediaItemPropertyReleaseDate
メディアアイテムの最初のリリース日です。
値はNSDateオブジェクトです。

MPMediaItemPropertyBeatsPerMinute
メディアアイテムのBPM(1分あたりの拍数)で、iTunesの『情報見る(Get Info)』ダイアログ内の『情報(Info)』タブにある、『BPM』の欄に対応しています。
値はNSUIntegerデータ型のNSNumberオブジェクトです。

MPMediaItemPropertyComments
メディアアイテムに関するテキスト情報で、iTunesの『情報見る(Get Info)』ダイアログ内の『情報(Info)』タブにある、『コメント(Comments)』の欄に対応しています。
値はNSStringオブジェクトです。

MPMediaItemPropertyAssetURL
メディアアイテムの指すURLで、AVAssetオブジェクト(または他のURLベースのAV Foundationオブジェクト)を任意のオプションを必要に応じて使用して生成できます。
値はNSURLオブジェクトです。
URLはipod-libraryのカスタムスキームを持ちます。
例えば、URLは次のようになります。
ipod-library://item/item.m4a?id=12345
URLの外側の処理は、AV Foundationフレームワークはサポートしません。


・imageWithSize:
(MPMediaItemArtworkクラス)

- (UIImage *)imageWithSize:(CGSize)size

指定したサイズのUIImageオブジェクトを生成して返します。

size:新しいUIImageオブジェクトのサイズをポイント単位で指定します。


●didItemChanged

awakeFromNibメソッドで通知センターにセレクタとして登録したメソッドで、現在再生中の曲が変わった場合にMPMusicPlayerControllerNowPlayingItemDidChangeNotification通知を受けて呼び出されます。

通知を受けるとupdateViewメソッドを呼び出し、制御パネルの情報を更新します。

- (void)didItemChanged:(NSNotification *)aNote {
    // 通知名を取得
    NSString *noteName = [aNote name];

    // 通知が『現在再生中の曲の変化』なら画面を更新
    if ([noteName isEqualToString:MPMusicPlayerControllerNowPlayingItemDidChangeNotification]) {
        [self updateView];    // 曲情報表示を更新
    }
}

589


・name
(NSNotificationクラス)

- (NSString *)name

通知の名前を返します。

戻り値は通常、通知を受け取る時にどのような処理をする通知かを調べるため、このメソッドを使用します。

通知名には任意の文字列を指定できます。

名前の衝突を回避するため、アプリケーション固有のプレフィックス(接頭辞)を付けた方が望ましい場合があります。


●dealloc

アプリケーション終了時に不要になる通知、awakeFromNibで生成・登録した通知センターやオブザーバを解放します。

手順としてはawakeFromNibと逆になり、

・beginGeneratingPlaybackNotificationsで開始した通知の停止
(endGeneratingPlaybackNotifications)

・addObserver:selector:name:object:でディスパッチテーブルに登録したオブザーバの解除
(removeObserver:)

という順序になります。

- (void)dealloc {
    // 通知の停止を指示
    [player endGeneratingPlaybackNotifications];

    // 通知センターのインスタンスを取得
    NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];

    // 通知先の登録を解除
    [noteCenter removeObserver:self];

    [super dealloc];
}

590


・endGeneratingPlaybackNotifications
(MPMusicPlayerControllerクラス)

- (void)endGeneratingPlaybackNotifications

再生通知の生成を終了します。


・removeObserver:
(NSNotificationCenterクラス)

- (void)removeObserver:(id)notificationObserver

レシーバのディスパッチテーブルから指定登録したオブザーバを全て削除します。

このメソッド(またはremoveObserver:name:object:)を呼び出す前に、notificationObserverまたはaddObserver:selector:name:object:で指定した任意のオブジェクトを解放してください。

以下に、事前に登録していた全ての通知someObserverの登録を解除について示します。

[[NSNotificationCenter defaultCenter] removeObserver:someObserver];

notificationObserver:削除するオブザーバを指定します。
nilを指定してはいけません。


●flipToMoreSide

制御パネルのMoreボタンをタップした際に、表側から裏側に移行するアクションメソッドです。

ウィンドウの制御パネルの位置にある表側のサブビューviewMainSideを取り外し、裏側のサブビューviewMoreSideを貼付け直すもので、その貼り替えをフリップのトランジションアニメーションで包んでいます。

- (IBAction)flipToMoreSide {
    // アニメーションの準備
    [UIView setAnimationsEnabled:YES];
    [UIView beginAnimations:@"Flip" context:nil];
    [UIView setAnimationDuration:0.5f];

    // トランジションアニメーションの設定
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:viewPlace cache:YES];

    // ビューの貼り替え
    [viewMainSide removeFromSuperview];    // 表側の制御パネルを外す
    [viewPlace addSubview:viewMoreSide];    // 裏側の制御パネルを貼り付ける

    // アニメーション実行
    [UIView commitAnimations];
}

・removeFromSuperview
(UIViewクラス)

スーパービューとウィンドウからレシーバのリンクを解除し、レスポンダチェーンから削除します。

レシーバのスーパービューがnilではない場合、このメソッドはレシーバを解放します。

ビューを再利用する予定の場合、このメソッドを呼び出す前に保持して適切な所で解放するか、別のビュー階層に後で追加してください。

決して表示しながらこのメソッドを呼び出さないでください。


トランジションアニメーション(2)』で説明しましたが、setAnimationsEnabled:、beginAnimations:context:、setAnimationTransition:forView:cache:、commitAnimationsメソッドはiOS 4で非推奨となっているので、transitionWithView:duration:options:animations:completion:メソッドに置換します。
(太字が修正した部分)

- (IBAction)flipToMoreSide {
    // トランジションアニメーションの設定
    [UIView transitionWithView:viewPlace duration:0.5f options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{

        // ビューの貼り替え
        [viewMainSide removeFromSuperview];    // 表側の制御パネルを外す
        [viewPlace addSubview:viewMoreSide];    // 裏側の制御パネルを貼り付ける
    }
    completion:NULL];
}

591


●flipToMainSide

制御パネルの裏面のBackボタンをタップした際に裏側から表側に移行するアクションメソッドです。

flipToMoreSideと同様に、裏側のサブビューviewMoreSideを取り外し、表側のサブビューviewMainSideを貼付け直すもので、その貼り替えをフリップのトランジションアニメーションで包んでいます。

- (IBAction)flipToMainSide {
    // アニメーションの準備
    [UIView setAnimationsEnabled:YES];
    [UIView beginAnimations:@"Flip" context:nil];
    [UIView setAnimationDuration:0.5f];

    // トランジションアニメーションの設定
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:viewPlace cache:YES];

    // ビューの貼り替え
    [viewMoreSide removeFromSuperview];    // 裏側の制御パネルを外す
    [viewPlace addSubview:viewMainSide];    // 表側の制御パネルを貼り付ける

    // アニメーション実行
    [UIView commitAnimations];
}

こちらもtransitionWithView:duration:options:animations:completion:メソッドに置換します。
(太字が修正した部分)

- (IBAction)flipToMainSide {
    // トランジションアニメーションの設定
    [UIView transitionWithView:viewPlace duration:0.5f options:UIViewAnimationOptionTransitionFlipFromRight animations:^{

        // ビューの貼り替え
        [viewMoreSide removeFromSuperview];    // 裏側の制御パネルを外す
        [viewPlace addSubview:viewMainSide];    // 表側の制御パネルを貼り付ける
    }
    completion:NULL];
}

592



参考文献

MPMusicPlayerController Class Reference

UIView Class Reference

MPMediaItem Class Reference

MPMediaItemArtwork Class Reference

NSNotificationCenter Class Reference

NSNotification Class Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

音楽プレイヤのメソッド(1)

2010. 07. 23
前回の『音楽プレイヤで使用しているクラス』の中で紹介したMPMediaPlaylistクラスは、今回使用していませんでした。
(MPMediaItemクラスのvalueForProperty:と同名のメソッドがMPMediaPlaylistクラスにも有り、検索でMPMediaPlaylistクラスが先にリストアップされていたために誤って紹介した次第です)

それはさておき、続いて『音楽プレイヤの作成』で使用しているメソッドについて説明します。


●awakeFromNib

awakeFromNibはNSObjectクラスに追加されているメソッドで、Interface Builderで作成したnibファイルをアプリケーションが展開した後に行う処理を記述しています。

詳細は『スライドショーのメソッド(2)』のawakeFromNibの項を参照していただくとしまして、よく見るとスーパークラスによる初期化を行っていなかったので追加しました。
(太字が追加した部分)

- (void)awakeFromNib {
    // スーパークラスによる初期化
    [super awakeFromNib];

    // プレイヤ生成
    player = [MPMusicPlayerController iPodMusicPlayer];

    // 音楽再生
    player.repeatMode = MPMusicRepeatModeAll;    // 全曲リピートに設定
    player.shuffleMode = MPMusicShuffleModeOff;    // シャッフル無しに設定
    [player play];    // 再生開始

    // 制御パネルの表側を貼り付ける
    [viewPlace addSubview:viewMainSide];

    // 現在再生中の曲の情報を画面に表示する
    [self updateView];

    // 通知センターのインスタンスを取得
    NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];

    // 再生曲が変化した時の通知先を登録
    [noteCenter addObserver:self selector:@selector(didItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:player];

    // 通知の開始を指示
    [player beginGeneratingPlaybackNotifications];
}

584

ここでは音楽プレイヤと、音楽プレイヤに表示する情報の変化を通知する通知センターの生成と初期化を行っています。

Media PlayerフレームワークのMPMusicPlayerControllerクラスで、iPodライブラリを使った音楽プレイヤの生成を行っています。
(『音楽プレイヤで使用しているクラス』の『MPMusicPlayerControllerクラス』の説明にある『iPod音楽再生プレイヤ』に該当します)

音楽プレイヤの生成後、リピートとシャッフルのモードを設定し、再生を開始します。

ウィンドウのアウトレットとして指定したviewPlaceの位置に、サブビューとして制御パネルの表側を追加し、後述するupdateViewメソッドで表示情報を更新します。

その後、(曲名やアルバム名などの)表示情報を更新するために、通知センターのインスタンスを生成します。

通知センターには自身をオブザーバ(通知先)とし、呼び出すメソッドとして後述するdidItemChanged:を指定、音楽プレイヤ(player)の現在再生中の曲が変わった場合のみに通知するよう登録しています。

登録後、MPMusicPlayerControllerによる通知の開始を行います。


・iPodMusicPlayer
(MPMusicPlayerControllerクラス)

+ (MPMusicPlayerController *)iPodMusicPlayer

iPodアプリケーションの状態を制御する、iPod音楽プレイヤを返します。

iPodアプリケーションの代わりとしてiPod音楽プレイヤを利用できます。

インスタンスはアプリケーションの実行時に、現在のiPodアプリケーションの状態と制御を取得します。

具体的な共有する状態を以下に示します。

・リピートモード(『Repeat Modes』参照)
・シャッフルモード(『Shuffle Modes』参照)
・現在再生しているアイテム(『nowPlayingItem』参照)
・再生状態(『playbackState』参照)

他のiPodの状態、例えばon-the-goプレイリストなどは共有されません。

アプリケーションが終了しても、再生状態の音楽は再生され続けます。


・repeatMode
(MPMusicPlayerControllerクラス)

@property (nonatomic) MPMusicRepeatMode repeatMode

音楽プレイヤの現在のリピートモードです。

利用できるリピートモードは『Repeat Modes』を参照してください。

リピートモードが明示されていない場合、repeatModeはデフォルトでMPMusicRepeatModeDefaultを設定します。


・Repeat Modes
(MPMusicPlayerControllerクラス)

repeatModeプロパティの値です。

enum {
    MPMusicRepeatModeDefault,
    MPMusicRepeatModeNone,
    MPMusicRepeatModeOne,
    MPMusicRepeatModeAll
};
typedef NSInteger MPMusicRepeatMode;

MPMusicRepeatModeDefault
ユーザの好みのリピートモード。

MPMusicRepeatModeNone
音楽プレイヤは現在の曲またはプレイリストを繰り返しません。

MPMusicRepeatModeOne
音楽プレイヤは現在の曲を繰り返します。

MPMusicRepeatModeAll
音楽プレイヤは現在のプレイリストを繰り返します。


・shuffleMode
(MPMusicPlayerControllerクラス)

@property (nonatomic) MPMusicShuffleMode shuffleMode

音楽プレイヤの現在のシャッフルモードです。

利用できるシャッフルモードは『Shuffle Modes』を参照してください。

シャッフルモードが明示されていない場合、shuffleModeはデフォルトでMPMusicShuffleModeDefaultを設定します。


・Shuffle Modes
(MPMusicPlayerControllerクラス)

shuffleModeプロパティの値です。

enum {
    MPMusicShuffleModeDefault,
    MPMusicShuffleModeOff,
    MPMusicShuffleModeSongs,
    MPMusicShuffleModeAlbums
};
typedef NSInteger MPMusicShuffleMode;

MPMusicShuffleModeDefault
ユーザの好みのシャッフルモード。

MPMusicShuffleModeOff
プレイリストはシャッフルされません。

MPMusicShuffleModeSongs
プレイリストの曲をシャッフルします。

MPMusicShuffleModeAlbums
プレイリストのアルバムをシャッフルします。


・play
(MPMusicPlayerControllerクラス)

- (void)play

現在の再生キューからメディアアイテムを再生し、可能であれば一時停止を再開して再生します。


・addSubview:
(UIViewクラス)

- (void)addSubview:(UIView *)view

レシーバの姉妹より上に表示するサブビューとして、ビューを追加します。

このメソッドは、viewの次のレスポンダとしてレシーバを設定します。

レシーバはviewを保持します。

ビュー階層からremoveFromSuperviewを使ってviewを削除する場合、viewは解放されます。

ビュー階層から削除した後もviewを保持して使用したい場合(例えば、ビューの番号を通して交換するなど)、removeFromSuperViewを呼び出す前にretainする必要があります。

ビューはスーパービューを一つだけ持つことができます。

viewのスーパービューがnilではなく現在のビューと同じではない場合、このメソッドは現在のビューのサブビューを作る前に、以前のスーパービューから削除します。


・defaultCenter
(NSNotificationCenterクラス)

+ (id)defaultCenter

タスクのデフォルトの通知センターを返します。

戻り値は現在のタスクのデフォルトの通知センターで、システムの通知に使用されます。


・addObserver:selector:name:object:
(NSNotificationCenterクラス)

- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender

レシーバのディスパッチテーブルに、オブザーバと通知セレクタ、オプションの基準として通知名とセンダーを追加登録します。

addObserver:selector:name:object:で指定したnotificationObserverやその他のオブジェクトは、removeObserver:またはremoveObserver:name:object:を呼び出す前に解放してください。

notificationObserver:オブザーバとして登録するオブジェクト。
この値はnilにしないでください。

notificationSelector:セレクタは、レシーバがnotificationObserverに通知を送信するための、メッセージを指定します。
メソッドはnotificationSelectorで(NSNotificationのインスタンスの)引数を一つだけ指定する必要があります。

notificationName:登録するオブザーバ用に、通知の名前を指定します。
つまり、この名前の通知のみオブザーバに配信されます。
nilを渡した場合、通知センターはオブザーバへの配信に通知名を使用しません。

notificationSender:オブザーバに通知を受信させたいオブジェクトを指定します。
このセンダーの送信する通知のみ、オブザーバに配信されます。
nilを渡した場合、通知センターはオブザーバへの配信にセンダーを使用しません。


・MPMusicPlayerControllerNowPlayingItemDidChangeNotification
(MPMusicPlayerControllerクラス)

現在再生しているメディアアイテムが変更された場合に投稿します。


・beginGeneratingPlaybackNotifications
(MPMusicPlayerControllerクラス)

- (void)beginGeneratingPlaybackNotifications

再生通知の生成を開始します。


●playOrPause

制御パネルの再生/一時停止ボタンのアクションメソッドです。

playbackStateプロパティで音楽プレイヤの現在の再生状態を取得し、一時停止状態なら再生、再生状態なら一時停止にします。

// 再生/一時停止
- (IBAction)playOrPause {
    // 現在の再生状態を取得
    MPMusicPlaybackState state = player.playbackState;

    // 一時停止中なら再生
    if (state == MPMusicPlaybackStatePaused) {
        [player play];
    }
    // 再生中なら一時停止
    else if (state == MPMusicPlaybackStatePlaying) {
        [player pause];
    }
}

585

・playbackState
(MPMusicPlayerControllerクラス)

@property (nonatomic, readonly) MPMusicPlaybackState playbackState

音楽プレイヤの現在の再生状態を示します。

利用できる再生状態は『Playback States』を参照してください。


・Playback States
(MPMusicPlayerControllerクラス)

playbackStateプロパティの値です。

enum {
    MPMusicPlaybackStateStopped,
    MPMusicPlaybackStatePlaying,
    MPMusicPlaybackStatePaused,
    MPMusicPlaybackStateInterrupted,
    MPMusicPlaybackStateSeekingForward,
    MPMusicPlaybackStateSeekingBackward
};
typedef NSInteger MPMusicPlaybackState;

playbackStateプロパティをチェックして、音楽プレイヤの状態を確認します。

プロパティの値によって、アプリケーションのユーザインターフェイスまたは他の適切な動作を更新することができます。

MPMusicPlaybackStateStopped
音楽プレイヤは停止しています。

MPMusicPlaybackStatePlaying
音楽プレイヤは再生しています。

MPMusicPlaybackStatePaused
音楽プレイヤは一時停止しています。

MPMusicPlaybackStateInterrupted
音楽プレイヤは電話の呼び出しなどで中断しています。

MPMusicPlaybackStateSeekingForward
音楽プレイヤは前方へシーク(早送り)しています。

MPMusicPlaybackStateSeekingBackward
音楽プレイヤは後方へシーク(巻き戻し)しています。


・pause
(MPMusicPlayerControllerクラス)

- (void)pause

音楽プレイヤが再生中の場合、一時停止します。

playを再度呼び出した場合、一時停止した場所から再生を開始します。


●skipToNext

制御パネルの次の曲にスキップするボタンのアクションメソッドです。

// 次の曲へスキップ
- (IBAction)skipToNext {
    [player skipToNextItem];
}

586


・skipToNextItem
(MPMusicPlayerControllerクラス)

- (void)skipToNextItem

再生キュー内の次のメディアアイテムの再生を開始、または音楽プレイヤが再生していない場合はその次に再生可能な以降のメディアアイテムを指定します。

再生キューが既に最後のアイテムである場合、このメソッドは再生を終了します。


●skipToPrevious

制御パネルの前の曲にスキップするボタンのアクションメソッドです。

skipToNextと異なり、現在の再生状態によって場合分けを行っており、曲の開始から3秒未満なら前の曲へ、3秒以上なら曲の先頭へ戻る制御を行っています。

// 前の曲へスキップ
- (IBAction)skipToPrevious {
    // 再生位置が曲の先頭から3秒未満なら前の曲へスキップ
    if (player.currentPlaybackTime < 3.0) {
        [player skipToPreviousItem];
    }
    // 再生位置が曲の先頭から3秒以上なら曲の先頭にスキップ
    else {
        [player skipToBeginning];
    }
}

587


・currentPlaybackTime
(MPMusicPlayerControllerクラス)

@property (nonatomic) NSTimeInterval currentPlaybackTime

現在再生しているメディアアイテムの、開始から現在の再生時間までを秒単位で測定します。

以下の理由により、このプロパティのアクセスは読み書き可能です。

・データを取得して、現在の再生時間をユーザに提供する。
・メディアアイテムの特定の時点にシークする。


・skipToPreviousItem
(MPMusicPlayerControllerクラス)

- (void)skipToPreviousItem

再生キュー内の前のメディアアイテムの再生を開始、または音楽プレイヤが再生していない場合はその次に再生可能な以前のメディアアイテムを指定します。

再生キューが既に最初のアイテムである場合、このメソッドは再生を終了します。


・skipToBeginning
(MPMusicPlayerControllerクラス)

- (void)skipToBeginning

現在再生しているメディアアイテムを最初から再生し直します。



参考文献

Media Player Framework Reference

MPMusicPlayerController Class Reference

UIView Class Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

音楽プレイヤで使用しているクラス

2010. 07. 22
前回の『音楽プレイヤの作成』で使用したクラスを説明します。


●Media Playerフレームワーク

このドキュメントのコレクションは、動画や音楽、音楽ポッドキャスト、オーディオブックファイルの再生についての基本的な機能を提供する、Media Playerフレームワークについて説明します。

このフレームワークは、アプリケーションからiPodライブラリへのアクセスも提供します。

ユーザのiTunesライブラリからオーディオベースのメディアアイテムを同期した、検索と再生に使用することができます。

iPodライブラリへのアクセスは読み込みのみです。

またこのフレームワークのMPVolumeViewクラスを使って、システムのオーディオ出力の音量レベルをユーザが調整できるようにすることもできます。


●MPMusicPlayerControllerクラス

MPMusicPlayerControllerオブジェクトまたは音楽プレイヤは、iPodライブラリのメディアアイテムの再生に使用します。

音楽プレイヤには二種類あります。

・『アプリケーション音楽プレイヤ』はアプリケーション内のローカルで音楽を再生します。
iPodアプリケーションの現在の再生アイテムに関知せず、iPodの状態に影響されません。

・『iPod音楽再生プレイヤ』はビルトインされているiPodアプリケーションを利用します。
インスタンスは現在のiPodアプリケーションの状態、例えば現在再生されているアイテムの識別をすることができます。
ユーザが音楽の再生中にアプリケーションを終了しても、音楽を再生し続けます。
iPodアプリケーションは、音楽プレイヤアプリケーションのリピートモード、シャッフルモード、再生状態、現在再生中のアイテムの直近の設定を持ちます。


●MPMediaPlaylistクラス

MPMediaPlaylistオブジェクトまたはメディアプレイリストは、関連メディアアイテムの再生コレクションです。

(メディアアイテムは『MPMediaItem Class Reference』で説明しています)

各プレイリストは名前、属性の設定、アプリケーションの起動間で保持している固有の識別子を持っています。

ユーザはデスクトップのiTunesを使用してプレイリストを構成したり、またはデバイス上でon-the-goプレイリストを生成します。

貴方のiOSアプリケーションではプレイリストは読み込みのみです。

プレイリストを入手するにはプレイリスト毎にグループ化されているメディアクエリを設定します。

返される各メディアアイテムのコレクションはメディアのプレイリストです。

Xcodeのデバッガコンソールにプレイリストと曲名を出力するコードを以下に示します。

MPMediaQuery *myPlaylistsQuery = [MPMediaQuery playlistsQuery];
NSArray *playlists = [myPlaylistsQuery collections];

for (MPMediaPlaylist *playlist in playlists) {
    NSLog (@"%@", [playlist valueForProperty: MPMediaPlaylistPropertyName]);

    NSArray *songs = [playlist items];
    for (MPMediaItem *song in songs) {
        NSString *songTitle =
            [song valueForProperty: MPMediaItemPropertyTitle];
        NSLog (@" %@", songTitle);
    }
}

メディアクエリを構築するためのAPIは『MPMediaPropertyPredicate Class Reference』と『MPMediaQuery Class Reference』で説明しています。


●MPMediaItemクラス

MPMediaItemオブジェクトまたはメディアアイテムは、iPodライブラリ内にある曲などの一つのアイテムを表します。

メディアアイテムは固有の識別子を持ち、MPMediaItemPropertyPersistentIDプロパティキーを使ってアクセスできます。

この識別子はアプリケーションの起動間で保持します。

メディアアイテムは広範囲のメタデータを関連付けすることができます。

メタデータにアクセスするには、valueForProperty:メソッドとこのドキュメントで説明するプロパティキーを一緒に使います。

またバッチ方式でメタデータにアクセスする場合はenumerateValuesForProperties:usingBlock:メソッドを使います。

いくつかの場合、この方が効率的です。

メディアアイテムの属性はiPodライブラリを検索してメディアクエリを構築するために使用します。

これらの属性は『Media Item Type Flags』、『General Media Item Property Keys』、『Podcast Item Property Keys』で説明しています。

メディアクエリについては『MPMediaQuery Class Reference』で説明しています。


●MPMediaItemArtworkクラス

MPMediaItemArtworkオブジェクトまたはメディアアイテムアートワークは、音楽アルバムのカバーアートなどのメディアアイテムに関連付けされた、グラフィカルな画像を表します。

メディアアイテムについては『MPMediaItem Class Reference』で説明しています。


●NSNotificationCenterクラス

NSNotificationCenterオブジェクト(または単に通知センター)は、タスク内の情報をブロードキャストする機構を提供します。

NSNotificationCenterオブジェクトは基本的に通知ディスパッチテーブルです。

オブジェクトを通知センターに登録して通知(NSNotificationオブジェクト)を受け取るには、addObserver:selector:name:object:またはaddObserverForName:object:queue:usingBlock:メソッドを使用します。

これらのメソッドの呼び出しでは、通知セットを指定します。

したがって、場合に応じてこれらのメソッドを呼び出し、異なる通知セットのオブザーバ(通知先)としてオブジェクトを登録することができます。

(通知センダーとして知られる)オブジェクトが通知をする場合、通知センターにNSNotificationオブジェクトを送信します。

通知センターは指定された通知メッセージが送信されると、基準登録で指定された通知対象である任意のオブザーバに通知し、唯一の引数として通知を渡します。

通知センターは各オブザーバの通知セットを指定する、通知ディスパッチテーブルを保持します。

通知セットは、通知センターに通知を行うサブセットです。

各テーブルには3つのアイテムが登録されています。

通知オブザーバ(Notification observer):必須
通知センターに条件を満たした通知を投稿するオブジェクト。

通知名(Notification name):オプション
通知セットに指定した名前の通知だけ絞り込むように登録します。

通知センダー(Notification sender):オプション
通知セットに指定したセンダーだけに送信するように登録します。

表1にディスパッチテーブルに登録する4つのタイプと通知セットを示します。
(このテーブルは常に通知オブザーバを省略しています)

表1 ディスパッチテーブルに登録するタイプ

通知名通知センダー指定された通知セット
指定指定指定したセンダーから特定の名前の通知
指定指定せず任意のセンダーから特定の名前の通知
指定せず指定指定したセンダーからの通知
指定せず指定せず全ての通知

表2に4つのオブザーバのディスパッチテーブルの例を示します。

表2 通知ディスパッチテーブルの例

オブザーバ通知名通知センダー
observerANSFileHandleReadCompletionNotificationnil
observerBniladdressTableView
observerCNSWindowDidChangeScreenNotificationdocumentWindow
observerCniladdressTableView
observerDnilnil

通知センターから通知される時、表2のそれぞれのオブザーバは以下のような通知を行います。

・observerA:NSFileHandleReadCompletionNotificationで名付けられた通知

・observerB:addressTableViewによる通知の送信

・observerC:NSWindowDidChangeScreenNotificationで名付けられた通知をdocumentWindowで送信し、addressTableViewで通知の送信

・observerD:全ての通知

通知を受け取るオブザーバは未定義です。

投稿可能なオブジェクトとオブザーバオブジェクトは同一です。

通知センターはオブザーバに同期した通知を提供します。

言い換えると、全てのオブザーバが通知を受け取って処理するまで、postNotification:メソッドは返せません。

非同期で通知を送信するにはNSNotificationQueueを使用してください。

マルチスレッドアプリケーションの場合、通知は全て通知が投稿されたスレッドに提供され、オブザーバ自身が登録された同じスレッドではありません。

重要:通知センターはオブザーバを保持しないため、解放する前に(removeObserver:またはremoveObserver:name:object:を使って)オブザーバの登録を解除する必要があります。
(事前に登録の解除を行わない場合、通知センターは解放されたオブジェクトにメッセージを送信してしまい、ランタイムエラーが発生します)

各タスクはデフォルトで通知センターを持っています。

通常は独自に生成しないでください。

NSNotificationCenterオブジェクト一つのタスク内でのみ通知を提供することができます。

他のタスクに通知を投稿したり他のタスクから通知を受け取りたい場合は、NSDistributedNotificationCenterオブジェクトを使用します。


●NSNotificationクラス

NSNotificationオブジェクトは、NSNotificationCenterオブジェクトによる他オブジェクトへのブロードキャストをできるようにするため、情報をカプセル化します。

NSNotificationオブジェクト(通知とも呼ばれる)は名前とオブジェクト、オプションの辞書を含みます。

名前は通知を識別するタグです。

オブジェクトは、通知のオブザーバに送信したい通知を投稿する任意のオブジェクトです。
(通常はこのオブジェクトが通知を投稿します)

辞書は他の関連するオブジェクトがあれば、それを格納します。

NSNotificationオブジェクトは不変オブジェクトです。

通知オブジェクトは、notificationWithName:object:またはnotificationWithName:object:userInfo:クラスメソッドで生成できます。

ただし、通常は自身で直接通知を生成しないでください。

NSNotificationCenterメソッドのpostNotificationName:object:とpostNotificationName:object:userInfo:は、最初に生成せずに通知を投稿することができる便利なメソッドです。

NSCopyingプロトコル

NSNotificationクラスはNSCopyingプロトコルを採用し、通知として扱うことが可能なコンテキスト独立値のコピーや再利用で作ることができます。

後に使用する、または分散オブジェクトシステムを使って他のプロセスに通知を送信するために、通知を格納することができます。

NSCopyingプロトコルは基本的に、コレクションでコピーできる最初のクラスの値として、通知を処理してクライアントに提供します。

配列内に通知を置いたり、配列にコピーメッセージを送信するなど、全てのアイテムは再帰的にコピーできます。

サブクラスの生成

NSNotificationは、追加した通知名、オブジェクト、辞書の情報を含めてサブクラス化することができます。

追加したデータは、通知とオブザーバ間で一致している必要があります。

NSNotificationはインスタンス変数の無いクラスクラスタです。

そのため、NSNotificationのサブクラス化は元のメソッドのname、object、userInfoをオーバーライドする必要があります。

初期化には好きな指定イニシャライザを選択できますが、イニシャライザがNSNotificationのinitの実装([super init])を呼び出さないようにしてください。

NSNotificationは直接インスタンス化するものではなく、initメソッドは例外を発生させます。



参考文献

Media Player Framework Reference

MPMusicPlayerController Class Reference

MPMediaPlaylist Class Reference

MPMediaItem Class Reference

MPMediaItemArtwork Class Reference

NSNotificationCenter Class Reference

NSNotification Class Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る






Lifestyle 650 home entertainment system
Calendar
06 | 2010/07 | 08
Sun Mon Tue Wed Thu Fri Sat
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Lifestyle 650 home entertainment system
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR