Hatena::Groupiphone-dev

Ni chicha, ni limona - 平均から抜けられない僕

2009-05-28

[iPhone][Develop][Test] iUnitTestを使ってみた。 17:40  [iPhone][Develop][Test] iUnitTestを使ってみた。 - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [iPhone][Develop][Test] iUnitTestを使ってみた。 - Ni chicha, ni limona - 平均から抜けられない僕  [iPhone][Develop][Test] iUnitTestを使ってみた。 - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

伊藤ソフトデザインさんがiPhone向けユニットテストフレームワーク「iUnitTest」をGitHubで公開(SourceForgeの記事)していて、その評判が良いので使ってみることにしました。

ただ、まだ使いこなし方がよく分かっていないので、今回はインストールと使い始めのところだけ(リアルタイムに)記録しています。

インストール

次の手順で行いました。

  1. まずGitHubからソース一式を持ってきて、展開。
  2. ReadMe.jp.txtをCarbonEmacsで読む(テキストエディットだと文字コードのせいか開けなかった)。
  3. ReadMeのとおり、展開したフォルダで「sudo ./setup」を実行。同じフォルダにはsetup.rbもあるけれどコチラじゃない*1
    • Xcodeの新規プロジェクト/新規ファイルでiUnitTest用のプロジェクトやクラスが作成できるようになる

簡単ですね。setup処理もすぐ終わりました。

サンプルを見て、知る

ReadMeに「サンプルプロジェクト'PrefecturesTest'を見てください」とあるので見てみることに。


ふむふむ、プロジェクトを開いたときにある「TargetClasses」グループにテストしたいクラスを置いて、そして「Tests」にはインストール作業で使えるようになったiUnitTest用クラスを置くといいんですね。


あれ?この TargetClasses にあるファイル、 PrefecturesTest の隣にある Prefectures 内のファイルを「プロジェクトを基準」で参照するようになっている。

・・・そうか、テストプロジェクトで分かった不具合の修正を本プロジェクトに即座に反映させるためか。この

 「テストプロジェクトにはコピーではなく参照でターゲットファイルを含めること

は今後の注意事項として覚えておこうっと。

それ以外をざっと見ても、このファイルはプロジェクトで使うファイルそのままで、特に何もiUnitTest用には手が加えられていないことを確認。


次に「Tests」グループのファイル。

なるほど、この〜Testというファイルの中で、テストしたいクラスのインスタンスを作成し、そのテストケースを「test」で始まるメソッドに書いてあげればいいんだな。ここを読んで気づいた点は、


  • 新規ファイルで作成できるテストクラスには「無垢(IUTTest)」「NavigationBarベース」「NavigationとTabベース」「Tabベース」があるけれど、サンプルでテスト対象になっているUITableViewControllerクラスにはNavigationBarベース(UINavigationBarBasedTest)」を使っている
  • どのテストクラスも、以下の特徴がある
    • setup/tearDown/deallocメソッドはテンプレートのまま触っていない
    • (UIViewController *)rootViewControllerで、テスト対象のクラスがインスタンス化されるようクラス名を変更している
    • testで始まっていればテストメソッド名は何でもよいみたい
    • 各テストメソッドそれぞれでテスト対象クラスをインスタンス化しなくても良い(毎回インスタンス化されるという情報をいただきました)
    • Testsというセクションにテストが書いてある(場所は関係ないと思うけれど・・・)。別に「Helpers」として何か書かなくても良いっぽい
    • サンプルプロジェクトでは「ASSERT_EQUAL」「ASSERT_EQUAL_INT」が使われている

など。


どんなテスト用マクロがあるの?

ASSERT_〜はIUTAssertion.hに書いてあったので、マクロだけ抜粋してみました。SAMEとEQUALの違いなども元ソースを調べて書いてあるので、単なるコピペではないです。

マクロ意味
ASSERT(value)値が真であることを期待する
ASSERT_FAIL(m)常に失敗する
ASSERT_SAME(_expected, _value)オブジェクトが同じであることを期待する(==演算子を使用)
ASSERT_NOT_SAME(_expected, _value)オブジェクトが同じではないことを期待する(==演算子を使用)
ASSERT_EQUAL(_expected, _value)オブジェクトが同じであることを期待する(isEqualメソッドを使用)
ASSERT_NOT_EQUAL(_expected, _value)オブジェクトが同じではないことを期待する(isEqualメソッドを使用)
ASSERT_EQUAL_INT(_expected, _value)int型の値が同じであることを期待する
ASSERT_NOT_EQUAL_INT(_expected, _value)int型の値が同じではないことを期待する
ASSERT_EQUAL_FLOAT(_expected, _value)float型の値が同じであることを期待する
ASSERT_NOT_EQUAL_FLOAT(_expected, _value)float型の値が同じではないことを期待する
ASSERT_EQUAL_FLOAT_DELTA(_expected, _value, _delta)float型の値が誤差Δの範囲で同じであることを期待する
ASSERT_EQUAL_DOUBLE(_expected, _value)double型の値が同じであることを期待する
ASSERT_NOT_EQUAL_DOUBLE(_expected, _value)double型の値が同じではないことを期待する
ASSERT_EQUAL_DOUBLE_DELTA(_expected, _value, _delta)double型の値が誤差Δの範囲で同じであることを期待する
ASSERT_NIL(_value)オブジェクトnilであることを期待する
ASSERT_NOT_NIL(_value)オブジェクトnilではないことを期待する
ASSERT_EQUAL_POINT(_expected, _value)CGPoint型の構造体が同じ値を持っていることを期待する
ASSERT_EQUAL_SIZE(_expected, _value)CGSize型の構造体が同じ値を持っていることを期待する
ASSERT_EQUAL_RECT(_expected, _value)CGRect型の構造体が同じ値を持っていることを期待する
ASSERT_RAISE(expr)指定した処理で例外が発生することを期待する
ASSERT_NOTHING_RAISED(expr)指定した処理で例外が発生しないことを期待する

色々あるものですね。


自分でテストプロジェクトを作ってみる

・・・。


・・・すみません、ここでブログを書く力が尽きてしまいました。

詳しいことは作者のブログiUnitTest - リンゴの水やり?(はてな)」にあるPDFファイルを見ていただくといいと思います。


ここで書こうと思っていたことが分かりやすく書いてあったので、という言い訳をさせてくださいな。

まとめ

その他で気づいた点


あまり参考にならなかったかもしれませんが、そのへんはご容赦ください。

*1:setupの中身を見ると分かるけど、実はsetup.rbを呼んでいるだけなんですけどね。

gutskungutskun2009/05/28 23:35マクロをまとめていただいてありがとうございます。

>毎回インスタンス化される?使い回される?
ここは毎回インスタンス化されます。

ReadMe.jp.txtには書き忘れてますが、opencodeも併用してみて下さい。
http://d.hatena.ne.jp/gutskun/20090427/1240825326

paellapaella2009/05/29 21:08コメントありがとうございます。まだ使いこなしている状態ではないので恐縮です。

毎回インスタンス化されるんですね。となればテストは前後のテスト状態を気にせず使えると理解しました。確かに、使い回されるとテストがテストである意味がなくなってしまいますものね。

opencodeも参考にさせてもらいます。
ありがとうございました。

2009-05-25

[iPhone][Develop] アプリ動作中に割り込みが入ったときの処理を記述する 11:06  [iPhone][Develop] アプリ動作中に割り込みが入ったときの処理を記述する - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [iPhone][Develop] アプリ動作中に割り込みが入ったときの処理を記述する - Ni chicha, ni limona - 平均から抜けられない僕  [iPhone][Develop] アプリ動作中に割り込みが入ったときの処理を記述する - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

アプリを操作している最中、アプリへの割り込みとして次のイベントが起こりえます。

  • スリープボタンが押される
  • ホームボタンを素早く2回押されて、ミュージックメニューが表示される
  • 電話を着信する(?iPhoneを持っていないので分かりません。だれか教えてください)

このときにアプリの動作を一時的に止めておきたい、そしてアプリに戻ってきたときに再び動作を再開したい、というようなニーズがあると思います。

今、私はメトロノームアプリを作成しているのですが、スリープしている最中に「チックタック」動いてほしくないし、UIデザインから見ても止めておくのが妥当ですよね。

その場合には、UIApplicationDelegateを実装しているクラスにて、次のメソッドを作っておいてあげれば良いようです。


- (void)applicationWillResignActive:(UIApplication *)application {
	// スリープボタンが押された時などに動作を一時停止する処理を記述
	NSLog(@"%s [Line %d] is called.", __PRETTY_FUNCTION__, __LINE__);
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
	// スリープボタン解除された時などに動作を再開する処理を記述
	NSLog(@"%s [Line %d] is called.", __PRETTY_FUNCTION__, __LINE__);
}

こんな感じ。


とりわけ、「音と画像を同期させている(ように見せている)」アプリの場合はスリープ時に動作を止めておかないと、スリープ解除したときに音と画像がずれて表示されるようになってしまうので注意です。

ゲームなんかでも「スリープしてたら勝手にゲームが終わってた」はイヤですものね。


以上、小ネタでした。


[iPhone] アプリアップデートする効能 11:28  [iPhone] アプリをアップデートする効能 - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [iPhone] アプリをアップデートする効能 - Ni chicha, ni limona - 平均から抜けられない僕  [iPhone] アプリをアップデートする効能 - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

アプリをリリース後、すぐに次のソフトを作りたくなるのが人の佐賀というものです。初出アプリが私のようにこっぱずかしいショボソフトであれば、そのまま売れなくなったらもうダメだろうなと思ってしまいたくなるのも分かります*1。ハイスミマセン、リリースしてからまだ一度もアップデートをリリースしていないです。


でも色々な話を聞いていると、アプリアップデートした場合は新着リストにアプリが載って、つまりまた人の目に晒してくれるようなので、また少し買ってくれる人が出てくれるかもしれないとのことです。なるほど、まだ儲けるチャンスはあると言うことですね。


それを聞いて、「これまでアプリを買ってくれた人への恩返しにアップデートを考えようかな」と思い始めました。< 前の段落と言っているコンテキストが違う。


そうそう、「ブログが見つかりません 」というブログを書いているSato氏と、SingingCatのid:frnk氏に以下のアドバイスをいただきました。


  • アプリアップデートした時、リリース日は自動で変わらないので、iTunes ConnectのPricingの日付を変更してあげる必要があります
  • iTunesConnectのPricingの日付を、Ready for Saleになった日に、その前日(つまりUS時間で当日になるように)に設定するのがコツです
    • これを先日付にしてしまうとAppStoreからアプリがいなくなっちゃう(その日になるまで表示されない)ので気をつけて下さい
  • Ready for Saleの案内は来ないことが多いけれど、朝起きたときにReady状態になっていることが多いので、朝起きたらiTunes Connectをまずチェック。

とのこと。なるほど、こういう一手間が売上増につながっていくのですね。ありがとうございました。

参考サイト

frnk氏がまとめた、もっと分かりやすい記事です。今日(2009/5/25)時点での最新情報も追記されていますので、チェックしてみてください。

 App Storeに表示される「リリース日」のまとめ - らっこのじゆうちょう

*1:おかげさまで世界で40本くらい売れたのですが。

2009-05-21

[iPhone][Develop] UIPickerViewでUIViewを表示させるときの座標情報について 17:20  [iPhone][Develop] UIPickerViewでUIViewを表示させるときの座標情報について - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [iPhone][Develop] UIPickerViewでUIViewを表示させるときの座標情報について - Ni chicha, ni limona - 平均から抜けられない僕  [iPhone][Develop] UIPickerViewでUIViewを表示させるときの座標情報について - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

※UIPickerViewではまってしまっていたことの備忘録です。iPhone OS3.0ではどうなっているか分かりませんので*1、あくまで2.2.1ということで。


例のドラム型のピッカーUI(UIPickerView)では、アイテムの表示方法に2種類のデリゲートを用意しています。


// 1) 文字列を返したい場合
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {}

// 2) ビューを返したい場合
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {}

ちなみに2が書いてある場合、1は書いてあっても無視されます。2でnilを返しても同様。

そして後者を使う場合には、次のようにして既存ビューの存在を確かめつつ、その中の情報を埋めていくわけで。

- (UIView *)pickerView:(UIPickerView *)picker
			viewForRow:(NSInteger)row
		  forComponent:(NSInteger)component reusingView:(UIView *)view {
	UILabel *label;
	if (view == nil) {
		view = [[UIView alloc] initWithFrame:CGRectZero];
		// @TODO: Rectangleの適当なサイズや、フォントが分かっていない。
		// ここでの23pxの高さは目測で調べました。
		label = [[UILabel alloc] initWithFrame:CGRectMake(-30.0f,-11.0f,80.0f,23.0f)];
		label.backgroundColor = [UIColor clearColor];
		label.opaque = NO;
		label.alpha = 0.85f;
		label.textAlignment = UITextAlignmentLeft;
		label.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
		// タグを0オリジンにしてセットしてはダメ(既存の何かとぶつかるみたい)
		[label setTag:component+100];
		[view addSubview:label];
		[label release];
	} else {
		label = (UILabel *)[view viewWithTag:component+100];
	}
	// 表示するテキストを埋め込み
	label.text = [NSString stringWithFormat:@"row:%d", row];

	return view;
}

ポイントはビューの座標。どうも各要素での{0,0}の位置はPicker内各Rowのど真ん中にあるらしく、サンプルのように負数を指定してあげないとどこかに寄った状態になってしまうみたいです。

ですので、

  • ビューの高さ : 23pxの半分なので11か12をセット
  • ビューの幅 : 事前に指定しておいたrowの幅の半分の値をセット

としてあげると良いみたいです。


最初、このことが分からずに一向に情報を表示してくれないPickerViewに業を煮やしておりましたです、ハイ。


補足

UIViewを返すデリゲート、必ずUIViewを返さないとうまく動いてくれません。このサイトこのサイトで紹介されているようなUILabelを直接渡してあげる方法は、少なくとも私の環境(2.2.1)では何も表示されませんでした。


もしこの方法で表示している方がいたらば教えてください。


現在の不明点

*1:分かったとしても書けないし。

akisutesamaakisutesama2009/06/08 23:17サンプルコードありがとうございます!おかげさまで、無事自作のUIPickerViewを作ることが出来ました。

ところで、文中ではUILabelを直接渡す方法ができないとおっしゃってますが、試したところ無事成功する方法を見つけたのでサンプルコードをご紹介させていただきますね。
http://akisute.com/2009/06/uipickerview.html

それではまたー。

paellapaella2009/06/11 21:26「UILabelのframe.size.heightが0になってしまっていた(要するにつぶれてしまっていた)のが原因」だったんですね。盲点でした。

ありがとうございます!お互い頑張っていきましょう。

KuldeepKuldeep2013/01/22 21:39At last! Someone who understands! Thanks for ponstig!

2009-05-14

[Mac][iPhone][Develop] CoreAnimationで、アニメーション無限ループさせる方法 14:27  [Mac][iPhone][Develop] CoreAnimationで、アニメーションを無限ループさせる方法 - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [Mac][iPhone][Develop] CoreAnimationで、アニメーションを無限ループさせる方法 - Ni chicha, ni limona - 平均から抜けられない僕  [Mac][iPhone][Develop] CoreAnimationで、アニメーションを無限ループさせる方法 - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

Core AnimationではCABasicAnimationクラスに色々とプロパティを設定することで、

などが設定できます。


たとえば最後のアニメーションの繰り返し回数を指定したい場合には、

    animationInstance.repeatCount = 10;

というように設定することで、設定したアプリを「10回繰り返す」というように宣言できます。便利ですね。


・・・さて、ここで困ったのが次の疑問:『アニメーションを永遠に繰り返すにはどうしたらいいのか』でした。Appleのドキュメントを見ても、それらしいプロパティはないし、試しに「-1」を設定してみても効果無し*1


便利なフレームワークなのにどうしたものかなぁ、とググっていたら、Appleがボクの質問にまさしく答えてくれるドキュメントを出していることに気づきました。Google検索結果の見出しでは以下の記述。

アニメーションは1秒の長さで、無限に反復します。アニメーションが1.5に到達すると、また0に戻り、繰り返されます。次のコードでこれを設定します。...

「これだ!やった、さすがアップル!」と期待して開いてみたら、そこにはこんなコードが。


pulseAnimation.duration = 1.0;
pulseAnimation.repeatCount = 1e100f; // ← ココに注目!
pulseAnimation.autoreverses = YES;

工工エエエ(´Д`;)エエエ工工

・・・あ、そうですか。これを「無限」て言いますか。


とまあともかく、これでアニメーションがいつまでも繰り返されている(ように見せる)処理が分かりました。めでたし、めでたし?


繰り返し回数についての追記

その後分かったことです。


repeatCountはfloatで定義されているので、“2.75”という指定をすると、「2回繰り返し、3回目の75%まで進んだところで止まる」という動作になることが分かりました。お、これは便利。


あとautoreversesがYESの場合、reverseぶんの動作も含めて「1回」とカウントされるのでご注意を。

*1:この場合は繰り返し無しと同じでした

takueitakuei2012/06/04 12:02pulseAnimation.repeatCount = 1e100f; // ← ココに注目!
ぷっ!!!マジか

2009-05-07

[iPhone][Develop] 自分の電話番号を文字列として入手する方法 20:07  [iPhone][Develop] 自分の電話番号を文字列として入手する方法 - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [iPhone][Develop] 自分の電話番号を文字列として入手する方法 - Ni chicha, ni limona - 平均から抜けられない僕  [iPhone][Develop] 自分の電話番号を文字列として入手する方法 - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

使っても審査に通るかどうかは分かりませんが、stackoverflowで「自分のiPhoneの電話番号を取得する方法」が載っていたので、メモとしてこちらにも載せておきます。


NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

これだけ。ちなみにiPhone SimulatorやiPod touchではnilが返ってくることを確認しました。


・・・いいなぁ、欲しいなぁ、iPhone

2009-05-06

[][] MetronomeサンプルプログラムのViewクラスを可視化してみた。 21:56  MetronomeサンプルプログラムのViewクラスを可視化してみた。 - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  MetronomeサンプルプログラムのViewクラスを可視化してみた。 - Ni chicha, ni limona - 平均から抜けられない僕  MetronomeサンプルプログラムのViewクラスを可視化してみた。 - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

手作業なんですが、Metronomeサンプルアプリの「錘を上下に動かすとテンポが変わる」「音が鳴る/止まる」などの操作性をどのように実現しているのかな、と関数呼び出しの関係を図示してみることにしました。


1クラス内の出来事なので、関数コールグラフのように書いています。二重線がpublicメソッドです。


f:id:paella:20090506215514g:image:w480


うーん、何だコレ。設計をきちんとしてから作ったのだろか。とてもゴチャゴチャしているし、同じような処理が複数箇所に跨がっていたり。


正直なところ、あまり参考になりませんでした。

LurraineLurraine2011/09/16 02:18I have been so bewlidreed in the past but now it all makes sense!

qsjijjqsjijj2011/09/17 01:28ax7Jnn , [url=http://qyeupcwhmmhn.com/]qyeupcwhmmhn[/url], [link=http://eybqcwwqkkie.com/]eybqcwwqkkie[/link], http://aucdootvuccs.com/

usltqszswyxusltqszswyx2011/09/17 18:53Qeqjb7 <a href="http://zcmigizkvpfr.com/">zcmigizkvpfr</a>

dordbymvndordbymvn2011/09/19 20:20P3HXv6 , [url=http://awzetpyjdjwe.com/]awzetpyjdjwe[/url], [link=http://hjjwgycgkqlc.com/]hjjwgycgkqlc[/link], http://oskiuowktcjx.com/

2009-05-05

[iPhone][Develop] OpenALで指定するカテゴリの効能がよく分かっていない件 18:09  [iPhone][Develop] OpenALで指定するカテゴリの効能がよく分かっていない件 - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [iPhone][Develop] OpenALで指定するカテゴリの効能がよく分かっていない件 - Ni chicha, ni limona - 平均から抜けられない僕  [iPhone][Develop] OpenALで指定するカテゴリの効能がよく分かっていない件 - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

iPhone OSでCore Audio(OpenAL)を使う場合、まずは


OSStatus result = AudioSessionInitialize(NULL, NULL, NULL, NULL);

みたいに初期化してから、次のようにカテゴリを指定します。


UInt32 category = kAudioSessionCategory_AmbientSound;
result = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);

このカテゴリについて調べてみることにしました。・・・が、まだ途中ですのでメモ程度になっています。すみません。

まず、カテゴリは次のようにenumで定義されています。


/*!
    @enum           AudioSession audio categories states
    @abstract       These are used with as values for the kAudioSessionProperty_AudioCategory property
                    to indicate the audio category of the AudioSession.
    @constant       kAudioSessionCategory_UserInterfaceSoundEffects
                        Use this category for sound effects such as touch feedback, explosions, etc.
    @constant       kAudioSessionCategory_AmbientSound 
                        Use this category for backgound sounds such as rain, car engine noise, etc.  Mixes with other music.
    @constant       kAudioSessionCategory_SoloAmbientSound 
                        Use this category for backgound sounds.  Other music will stop playing.
    @constant       kAudioSessionCategory_MediaPlayback 
                        Use this category for music tracks.
    @constant       kAudioSessionCategory_LiveAudio 
                        Use this category for interactive music such as playing an instrument on the screen.
    @constant       kAudioSessionCategory_RecordAudio 
                        Use this category when recording audio.
    @constant       kAudioSessionCategory_PlayAndRecord 
                        Use this category when recording and playing back audio.
*/
enum {
    kAudioSessionCategory_UserInterfaceSoundEffects  = 'uifx',
    kAudioSessionCategory_AmbientSound               = 'ambi',
    kAudioSessionCategory_SoloAmbientSound           = 'solo',
    kAudioSessionCategory_MediaPlayback              = 'medi',
    kAudioSessionCategory_LiveAudio                  = 'live',
    kAudioSessionCategory_RecordAudio                = 'reca',
    kAudioSessionCategory_PlayAndRecord              = 'plar'
};

この値が、再生中の音楽とどのように関連しているかはBigStopWatchの作者のブログ:「AudioSession その2 AudioCategory」で確認できます(有益な情報をまとめてくださった同ブログの著者には多謝です)。


で、色々なソースを見ていると、どうも再生中の曲そのままで効果音を鳴らせるkAudioSessionCategory_AmbientSoundをほとんどのケースで使っています。有名なゲームやソフトでもそうなので、多分それで良いんだと思うのですが、効果音としては本当に適当なのかが微妙。


たとえば

「リアルタイム性を意識した時にはkAudioSessionCategory_LiveAudioを使った方がいいのか」

「そもそもレスポンス性能との違いは何?」

みたいな疑問が湧いてきます。色々と変化させてみたけれど、聴覚上の変化はほとんどなし。


うーん、何が違うんだろう・・・と悩んでいたら、「AppleのAudio Session Services Reference(PDF注意)」にもう少し詳しい説明が載っていました。以下はその抜粋:


kAudioSessionCategory_UserInterfaceSoundEffectsFor sound effects such as touch feedback, explosions, and so on.
kAudioSessionCategory_AmbientSoundFor long-duration sounds such as rain, car engine noise, and so on. It is also for “play a long” style applications, such a virtual piano that a user plays over iPod audio. When you use this category, audio from built-in applications, such as the iPod, mixes with your audio.
kAudioSessionCategory_SoloAmbientSoundThe default category, used unless you set a category with the AudioSessionSetProperty (page 10) function. The solo ambient sound category is for long-duration sounds such as rain, car engine noise, and so on. When you use this category, audio from built-in applications, such as the iPod, is silenced.
kAudioSessionCategory_MediaPlaybackFor playing recorded music or other sounds that are central to the successful use of your application. When you use this category, audio continues with the Ring/Silent switch set to silent. Audio played using this category continues when the screen locks.
kAudioSessionCategory_LiveAudioFor live performance of music, such as for an application that simulates a piano.
kAudioSessionCategory_RecordAudioFor recording audio; it silences playback audio.
kAudioSessionCategory_PlayAndRecordFor simultaneous recording and playback of audio, such as for a VOIP(voice over IP) application.

だそうです。iPhone OSの機能は制限されているから、Mac向けの資料にまで視野を広げた方が良さそうな雰囲気がすることは分かりました。