はじめに:目覚まし時計アプリを作成しています。目覚まし時計プロなどの他の多くのアラームアプリは、画面がロックされていてアプリがフォアグラウンドにあるときにアラームを再生できます。それらのアラームは無制限の時間再生でき、システムの音量を使用して徐々に音量を上げることができます。また、音楽コントロールを制御することもできません(マルチタスク画面を開いてスクロールしてオーディオを再生すると、アイコンは表示されません)
その機能を再現するのに問題があります。
アプリがフォアグラウンドにあるときにアラームを再生するために、ローカル通知を起動します。これは非常に効果的です。画面がロックされている間(およびアプリが非アクティブ状態になっている間)、成功は限られています。
私は次の方法を使用しました:
NSTimer
画面がロックされているときに、バックグラウンドタスクで毎秒実行します。最大10分を超えてアプリを開いたままにすることができましたが、サウンドを再生できませんでした。時が来たときを使用して1秒間のサイレントサウンドを再生し
AVAudioPlayer
ます。サウンドが終了したら、サウンドを再生して、アプリが非アクティブ(画面がロックされている)状態にあるかどうかを確認します。画面がロックされた状態で、アラームを鳴らす時間になっている場合は、それを鳴らします。ここでの問題は私が使用しなければならないことです[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
バックグラウンドで曲を更新し続けるために。このメソッドは、音楽コントロールにWakeを表示し、現在再生中の音楽を停止します。
- #1と#2の組み合わせ。アプリが開いたら、無限の繰り返しでサイレントサウンドを再生します。画面がロックされたら、タイマーを起動して、アラームを鳴らす時間かどうかを確認します。アラームを鳴らす時間になったら、無音をアラーム音に切り替えます。システムは最終的にアプリを強制的に閉じます
私の質問を助けたが解決していない関連知識:
- サイレントモードでiOS6にロックされているときに、オーディオの再生を開始するにはどうすればよいですか?
- iOS5ディープスリープ防止
- アプリがバックグラウンドにある間に中断した後、コードの実行を再開する
- バックグラウンドiphoneSDKで音楽を再生する方法
概要:画面がロックされ、アプリがフォアグラウンドにある間、10分が経過した後にプロセスが強制終了されるのを防ぐことはできません。
アップデート
最終的にhttps://github.com/mruegenberg/MMPDeepSleepPreventerを使用して、10分後にサウンドを再生できるようになりました。しかし、これは狂ったようにバッテリーを使い果たします。より効率的な解決策を見つける必要があります。
更新2
アプリストアからhttp://marcopeluso.com/アプリの一部をダウンロードしました。彼はDeepSleepPreventerの作成者です。私は彼のアプリのいくつかをダウンロードし、いくつかの機器のテストを実行し、彼のアプリが私のアプリほどバッテリーを消耗していないことを確認しました(彼のブログのどこかで主張されているように、1時間あたり約2.5%)。私は自分のアプリを最適化する必要があると確信しています。そうすれば、バッテリーの消耗の問題はなくなり、問題は解決します。
UPDATE3最終的にhttps://github.com/mruegenberg/MMPDeepSleepPreventer を使用しました
私はそれを独自の別のxCodeプロジェクトで実行しましたが、アプリがバックグラウンドにある場合はCPUの0.5%しか使用しません。私のアプリがCPUを吸っていたことがわかりました。だから今はすべてうまく機能しています:)