Nakamura1最近、CordovaでiPhoneとAndroidアプリを開発しています。CordovaはPhoneGapとも呼ばれていますが、ほとんど同じものです。CordovaはApache財団で管理しているオープンソースのプロジェクト名。PhoneGapはAdobeの製品名ですね。Cordovaは、HTML5とJavaScriptというWebアプリの技術だけで、iPhoneとAndroidのハイブリッドアプリが作れる!という夢のように聴こえるフレームワークです。実際に使ってみると色々とハマるハマる。(-_-;)サクッと作って、サクッとアプリ公開・・・とは、なかなかいかないです。簡単そうに見えて、実にやっかいですね。Cordovaってやつは!言い挙げていけばキリがないですが、特にひどいなぁと思っている問題を今回メモしておきます。Pluginの使い方についてCordovaで音を鳴らすには、Cordova-Media-Pluginというプラグインを一般的に使用します。プラグインのインストールはこんな感じ。cordova-plugin-mediaプラグインが提供するMediaクラスで音楽ファイルを開きます。});第1引数がファイル名、第2引数がファイルオープンに成功したときのコールバック関数、第3引数がファイルオープンに失敗したときのコースバック関数です。media.play();ポーズする。media.pause();ストップする。media.stop();とっても簡単ですね。Androidでのループ再生テクニックこの一見とても簡単に見えるCordova-Media-Plugin、実際使う上ではちょっと面倒な点がいろいろあります。音楽をループ再生させる場合。iPhoneの場合ならば、media.play(numberOfLoops:"infinite");と書くだけでループ再生できます。Androidの場合は、APIレベルでループ再生ができません。仕方がないので、タイマーで100msくらいのインターバルで再生が終わったかどうかをチェックし続ける必要があります。公式ドキュメントに記載されていますが、こんな感じです。Mediaの再生ポジションを一定周期で確認する。再生が終了していたら、また再生する。8以上の実機で発生する問題(バグ?)で、このCordova-Media-Pluginを使って、やっと作ったiOSアプリ。iPhoneシミュレータ上では問題なく動作するものの、iPhoneの実機では動作しない現象が起こります。僕もよく詳しく把握してませんが、どうも条件として下記のときに問題が発生するようです。iOS8以上のとき複数のMediaインスタンスを使って音楽を同時再生させているときループ再生ではない音楽(効果音など)が再生し終わったときようは、BGMを鳴らしながら、効果音を鳴らす、というよくあるシチューエーションですね。この条件が重なったタイミングで、下記のエラーメッセージとともに、オーディオIOが無効化されて、再生中の全ての音楽が止まります。session.media.stop()で手動で音楽を止めるとこの問題は発生しません。ある音楽ファイルが最後まで再生し終わって、自動的に再生が止まるとったその瞬間、この問題が発生します。iOS8からオーディオ周りの仕様が変わったことに起因しているようです。Cとか全然知らないので、はっきりとした原因は理解していません)とりあえず、下記の対策で解決することがわかりました。evalJs:jsString];}これの最後の部分を↓のようにコメントアウトする。evalJs:jsString];}とりあえずは、これで動作するようになります。これを調べるのに、すごい時間かかりました。いまはiOS9の時代となっているので、いまだにこの症状が残っているというのが、どうしてなのかなぁ。*メールアドレス(公開はされません。システム、業務システム等の開発をしています。このブログでは、日頃の開発でぶつかった問題と発見した解決法をメモしていきます。同じ問題にぶつかっているどこかの誰かさんのお役にたてたら嬉しいです。Python、Django、AWS、画像処理などについてお困りでしたら、お気軽にご連絡ください。最近の投稿システム開発にかかる費用ってどのくらい?内訳を徹底分析!起業して2年。横浜のITシステム開発会社が辿った道。