これで立ち止まるようなアプリを組んでいる人はいないとは思いますが、実際に私がはまって、かつそれ系の正確な説明がどこにもないのでここでそれを紹介します。
iOS4.0以降はマルチタスクが採用されているので、アプリがバックグラウンド状態になったときにシステムからユーザーへの通知ができるように
UILocalNotificationというインターフェイスを用いてその情報をシステムに登録することができます。Appleの解説ページでも探せばサンプルコードがあります。
問題は、このUILocalNotificationが持っているプロパティで、soundNameというものがあり、これの説明が
For this property, specify the filename (including extension) of a sound resource in the application’s main bundle or UILocalNotificationDefaultSoundName to request the default system sound.
と書いてあります。問題は、この英文の翻訳で、私は簡単にこのように訳しました。
このプロパティはアプリケーションのメインバンドルにあるサウンドリソースを拡張子付きで示されたもの、もしくはデフォルトのシステムサウンドを使うときはUILocalNotificationDefaultSoundNameを与えます。
この説明だと、自前のサウンドファイルを指定したいときは
UILocalNotification *notify; notify = [[UILocalNotification alloc] init]; ・・・ notify.soundName = [[NSBundle mainBundle] pathForResource:@"notify" ofType:@"caf" inDirectory:@"sound"]; ・・・
と書きたくなるのですが、これが間違いで、正しいのが
notify.soundName = @"sound/notify.caf";
と、mainBundleからの相対パスで記述しなければならないというものである、ということらしいです。(らしい、なのは一応実機debugでそういう結果が出たのでこういうことだろう、という意味)
つまり、UILocalNotificationのsoundNameは相対パス記述でなければならず、絶対パスの時サウンドは再生されないということ・・・だと思われます。
何とも面倒な仕様ですね。自分の日本語訳が間違っている(相対パスを使うの意味が含まれている)のかもしれませんが・・・
もう一つ陥りやすいミスがUILocalNotificationで使えるサウンドフォーマットは限定されているということです。読み飛ばしていたので原因解析に時間がかかりました・・・。
もう一つ今現在でもつまずいている部分があるのですが、それは解決したらまたネタにしたいと思います。