19

はじめに:目覚まし時計アプリを作成しています。目覚まし時計プロなどの他の多くのアラームアプリは、画面がロックされていてアプリがフォアグラウンドにあるときにアラームを再生できます。それらのアラームは無制限の時間再生でき、システムの音量を使用して徐々に音量を上げることができます。また、音楽コントロールを制御することもできません(マルチタスク画面を開いてスクロールしてオーディオを再生すると、アイコンは表示されません)

その機能を再現するのに問題があります。

アプリがフォアグラウンドにあるときにアラームを再生するために、ローカル通知を起動します。これは非常に効果的です。画面がロックされている間(およびアプリが非アクティブ状態になっている間)、成功は限られています。

私は次の方法を使用しました:

  1. NSTimer画面がロックされているときに、バックグラウンドタスクで毎秒実行します。最大10分を超えてアプリを開いたままにすることができましたが、サウンドを再生できませんでした。時が来たとき

  2. を使用して1秒間のサイレントサウンドを再生しAVAudioPlayerます。サウンドが終了したら、サウンドを再生して、アプリが非アクティブ(画面がロックされている)状態にあるかどうかを確認します。画面がロックされた状態で、アラームを鳴らす時間になっている場合は、それを鳴らします。ここでの問題は私が使用しなければならないことです

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

バックグラウンドで曲を更新し続けるために。このメソッドは、音楽コントロールにWakeを表示し、現在再生中の音楽を停止します。

  1. #1と#2の組み合わせ。アプリが開いたら、無限の繰り返しでサイレントサウンドを再生します。画面がロックされたら、タイマーを起動して、アラームを鳴らす時間かどうかを確認します。アラームを鳴らす時間になったら、無音をアラーム音に切り替えます。システムは最終的にアプリを強制的に閉じます

私の質問を助けたが解決していない関連知識:

  1. サイレントモードでiOS6にロックされているときに、オーディオの再生を開始するにはどうすればよいですか?
  2. iOS5ディープスリープ防止
  3. アプリがバックグラウンドにある間に中断した後、コードの実行を再開する
  4. バックグラウンド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を吸っていたことがわかりました。だから今はすべてうまく機能しています:)

4

2 に答える 2

1

デバイスがオンのときにアプリがフォアグラウンドにある場合でも、アプリがロックされた後、バックグラウンドに移動します(willresignactiveが呼び出されます)。私がインターネットで集めたものから、自分でサウンドをループするのではなく、メインのアプリバンドルでこれらの形式のいずれかでカスタム音楽ファイルを提供する必要があります。

  • リニアPCM
  • MA4(IMA / ADPCM)
  • µLaw
  • 法律

カスタムサウンドは30秒以下のみです。UILocalNotificationオブジェクトを初期化した後、そのfiredateプロパティを設定する必要があります。これは、通知を起動する日時(これも繰り返し)です。次に、alertBody(「ウェイクアップ」など)を介してアラートメッセージを設定し、alertActionを介してアラートボタンの文字列を設定します。カスタムサウンドのファイル名は、soundNameプロパティに入ります。UIApplicationメソッドであるscheduleLocalNotification:を呼び出して、通知インスタンスを提示します。このメソッドを呼び出す時間は、通知が発生する時間である必要はなく、通常はそうではないことに注意してください。。また、定期的な通知を設定した場合でも、これを1回呼び出すだけで済みます。cancelLocalNotification:を呼び出してキャンセルします。これで、アプリがフォアグラウンド、バックグラウンド、または開いていないかどうかに関係なく、アラームが鳴るはずです。

それはすべてここにあります。

于 2013-03-13T20:01:04.497 に答える
1

上記の私の応答を参照してください。基本的には

最終的にhttps://github.com/mruegenberg/MMPDeepSleepPreventerを使用しました

私はそれを独自の別のxCodeプロジェクトで実行しましたが、アプリがバックグラウンドにある場合はCPUの0.5%しか使用しません。CPUを殺していたのは私のコードだったことがわかりました。今はすべて順調です!

于 2013-03-31T18:08:12.760 に答える