2

私はタイマーアプリを持っています。それは無期限にカウントされます(ユーザーがタイマーを停止するまで)。これは、デフォルトの iOS クロック ストップウォッチとほとんど同じように機能します。

責任あるバックグラウンド アプリであることに関する記事を読みました。UI の変更は発生しておらず、アプリがバックグラウンドになるとタイマーを停止し、フォアグラウンドに戻るとタイマーを再開します。アプリは約 30 分ごとにローカル通知を送信して、ユーザーに休憩を取るよう促します。

問題: 必ず数時間 (2 ~ 6 時間) 後にアプリが終了し、現在のタイマーと情報が失われます。

私が試したこと:

-前述のように、責任あるバックグラウンド アプリであるというガイドラインに従うようにアプリを変更しました (タイマー UI をカウントアップし、バックグラウンドでもタイマーを実行する前に)。私のアプリは多くのメモリを使用していないか、集中的なタスクを実行していないため、これで問題が解決すると思いました。

-現在のタイマーのデータを (NSUserDefaults に) ApplicationWillTerminate に保存してから、DidFinishLaunchingWithOptions で復元しようとしました。うまくいかないようです。ApplicationWillTerminate が呼び出された場合、データが保存され、アプリの再起動時に復元されるため、私のアプリは強制終了または何かのようです。神秘。

-現在、ApplicationDidEnterBackground で NSTimer の開始時刻の NSDate を保存し、タイマーを無効にして、タイマーを開始し、ApplicationWillEnterForeground で開始時刻を復元しています。まだ運がありません。

問題は、これが私のユーザーのごく一部に影響を与えているということです。つまり、すべての人にとって問題であるとは限らないため、混乱を招きます. もちろん、それはかなり不十分なバグなので、まだ修正したいと思っています-そして、私自身(iPhone 5で)に遭遇したので、必ずしも古いiPhoneのメモリ不足の何かまたは他の問題ではありません.

これは本当に私を驚かせました。私は調査を行い、スタックオーバーフローの質問をかなりよく調べましたが、私を助けるものはあまり見つけられないようです.

ご不明な点がございましたら、お気軽にお問い合わせください。

4

2 に答える 2

2

アプリがバックグラウンドに入ったら、タイマーの経過時間を記録します (例: NSUserDefaults または任意の方法で)。現在の時刻も記録します。アプリがフォアグラウンドに戻ったら、記録した 2 つの値を見て、それに応じて経過時間を更新します。

経過時間 = 保存された経過時間 + (現在の時間 - バックグラウンドに移動した時間)

刻々と過ぎていく秒数を追跡するためだけに、ユーザーのバッテリーを消費するバックグラウンドでアプリをアクティブにしておく必要がある理由はまったくありません。

また、applicationWillTerminate に依存しないでください。applicationWillEnterBackground を使用します。

于 2013-09-10T22:31:21.167 に答える
2

applicationWillTerminate基本的に呼び出されることはありません。アプリがバックグラウンドにあり、メモリから削除された場合は呼び出されません。アプリがしばらく使用されていない場合は、アプリがメモリから削除されることを期待する必要があります。「しばらく」の長さは、その時点でデバイスが他に何をしているかによって異なります...applicationDidEnterBackground:またはを使用するのが最適applicationWillResignActive:です。

于 2013-09-10T22:32:17.993 に答える