1

アプリが実行されていないときに発生するローカル通知に関して、非常に奇妙な問題が発生しました。実行されていないということは、完全に終了していることを意味します (ホームボタンをダブルタブしてもタスクリストに表示されません)。

通常の実行状況では、アプリがバックグラウンドで実行されているときに、デバイスが X 秒以上静止している場合、アプリは警告音とともにローカル通知を生成します。その 15 秒後にアクションが実行されない場合、別のローカル通知が緊急メッセージとともに生成されます。

アプリが終了してから数時間後または数日後にランダムに、デバイスは突然警告通知を報告し、その後約 15 秒後に緊急通知を報告します。これは、アプリがバックグラウンドで正常に実行されている場合と同じです。前述のとおり、アプリが実行中のタスク リストに表示されておらず、完全に終了しているように見えることを確認しました。

アプリは、場所、音声、VOIP の長期バックグラウンド処理モードに登録されています。

アプリが終了すると (applicationWillTerminate で)、クリーンアップを実行します。これには、タイマーのシャットダウンと無効化、ローカル通知のキャンセルなどが含まれます。

私には2つの理論があります:

  1. これらの「ゴースト」通知は、アプリの実行中にキューに入れられたが、今まで実行されなかった古い通知にすぎないのでしょうか (私の質問は、警告と緊急通知の時間差がまだ尊重されているのはなぜですか)。
  2. アプリが深いバックグラウンドのどこかで「密かに」実行されている可能性はありますか? その場合、デバイスが定期的にアプリを「起動」しているように見えます。この場合、この「モーニング コール」の基準として使用しているデバイスは何ですか。

誰かがこの奇妙な問題に遭遇したのではないかと思います。もしそうなら、どうすれば問題を解決できますか?

追伸 - 私たちは iOS 開発にまったく慣れていないため、完全に明らかな見落としがある場合は事前に謝罪

更新 #1 xCode のログ メッセージを使用して、アプリケーションがタスク バーの閉鎖によってシャットダウンされたときに、applicationWillTerminate が一貫して呼び出されることを確認しました。ただし、この動作が信頼できるかどうかについては多くの議論があるように思われるため、私の観察が一貫していると信じているかどうかを最終的には言いませんが、私はその方向に傾いています. ただし、これに関するさらなる洞察をいただければ幸いです。

更新 #2 昨夜、新しいアプローチを試しました。これまでは、メソッドを使用して「今すぐ」通知を送信するようにスケジュールし[application scheduleLocalNotifications]、日付を現在の時刻に設定していました。代わりに、[application presentLocalNotificationNow]メソッドを使用し、日付/時刻を指定しませんでした。アプリは引き続き正常に機能しますが、アプリが実行されていない昨夜、「ゴースト」通知がランダムにトリガーされたため、問題は解決しませんでした。問題が「古い通知」関連の問題ではなく、長期的なバックグラウンド実行登録の結果としての何らかのトリガーによりアプリケーションが「起動」することに関係しているのかどうか疑問に思っています.

4

1 に答える 1

4

アプリが UILocalNotification をスケジュールすると、アプリではなくオペレーティング システムによって処理されます。したがって、アプリが強制終了されたとしても、それらは引き続きオフになります。

いいえ、あなたのアプリはまだ深いバックグラウンドで密かに実行されているわけではありません。これらは、すでにスケジュールされている通知がオフになっているだけです. 通知に repeatInterval を設定している可能性がありますか?

以下を使用して、すべての通知をクリアできます。

 [[UIApplication sharedApplication] cancelAllLocalNotifications];

onnoweb が述べたように、アプリが強制終了される前に applicationWillTerminate が呼び出されていない可能性があります。ユーザーがタスクバーでアプリを閉じたときに常に呼び出されるかどうかはわかりません。


コメントに応答するように編集:

私の最初の考えは、間違った開始日で UILocalNotifications をスケジュールしているようだということです。スケジューリングの方法を確認することをお勧めします。アプリが強制終了された翌日にオフになる可能性がある唯一の方法は、アプリがまだ実行されている間にそれらをスケジュールした場合です。


さらなるコメントに対応するために編集されました:

Teeg - アプリを強制終了したときに applicationWillTerminate が呼び出される可能性はあると思いますが、呼び出される保証はありません。私が読んだことから、アプリが一時停止状態にある場合、メソッドは呼び出されません。バックグラウンド タスクを長時間実行しているアプリがどのように機能するかは正確にはわかりませんが、おそらくバックグラウンド状態と一時停止状態が切り替わります。わからない。しかし問題は、電話をかけることです

[[UIApplication sharedApplication] cancelAllLocalNotifications];

すべての通知をキャンセルします。したがって、その後に 1 つがオフになった場合、それはメソッドが呼び出されなかったという証拠です。別の可能性として、メソッドが呼び出された可能性があると思いますが、アプリが強制終了される前に、すべての通知をキャンセルするのに十分な時間がありませんでした。あなたがそこで何かをするのにどれくらいの時間がかかるかについてはよくわかりません。もう一度お勧めしますが、あなたの最善の策は、そもそもなぜこれらの通知がスケジュールされているのかを調べることです.

于 2012-09-17T20:30:02.077 に答える