2

applicationSignificantTimeChange問題:手動時刻変更を検出する方法を知っています。しかし、メソッドのドキュメントには次のように書かれています:

大幅な時刻の変更の例としては、真夜中の到来、通信事業者による時刻の更新、夏時間への変更などがあります。デリゲートは、このメソッドを実装して、時間を表示する、または時間の変化に敏感なアプリケーションのオブジェクトを調整できます。

そのため、手動の時刻変更だけでなく、真夜中の到着も検出します。私のアプリケーションでは、ユーザーにアラートボックスが表示されるため、問題が発生します。

時間を変更しました。実際の時間に戻してください。

真夜中過ぎにアプリを再開した場合でも (または、アプリを最小化して眠りについた可能性があります。翌日、彼は目を覚まし、アプリを再開し、驚くべきことに時間変更の通知を受け取ります)。

質問: 午前 0 時の到着時ではなく、手動での時刻変更時にのみアラートを表示するにはどうすればよいですか?

4

3 に答える 3

1

Apple docリンクを使用するだけですNSSystemClockDidChangeNotification

于 2015-03-12T10:56:11.460 に答える
1

リモート サーバー タイム チェックのバリエーションを 1 年または数年使用しています。iOSでは、かなりうまく機能します。

  1. リモート時間を取得します。

  2. 時間チェッククラスで、リモート時間とデバイス時間の間のオフセットを保存し、それを単純な NSTimeInterval 変数に保存します。

  3. これで、時間チェッククラスからいつでも「リアルタイム」を取得できます。これは、現在のデバイス時間を取得し、保存されたオフセットを追加するだけで、常にリアルタイムを取得できるためです。

  4. ユーザーが時間設定をいじる可能性があるため、アプリがバックグラウンドになるたびに、保存されているオフセットを削除する必要があります。

  5. アプリのフォアグラウンド イベントごとに、3. を再度実行する必要があります。再びリモート時刻を取得します。そのオフセットが再び得られるまで、リアルタイムを取得するための呼び出しを拒否します。存在するリアルタイムに依存する呼び出しは、リアルタイムがまだ取得されていないイベントで正常に失敗する必要があります。

  6. これで、取得したオフセットは、前回取得したオフセットと比較する必要があります/比較できます。15 秒などのしきい値を決定します。前回からのオフセットの変更がそのしきい値を超えている場合は、ユーザーが時間を手動で変更した可能性があります。これは私にとって有益なイベントです。もちろん、ユーザーはデバイスの時刻を変更できますが、私はいつでも (ほとんどの場合) リアルタイムを手元に置いています。

Afaik、私は常に UTC タイムスタンプを使用して、ロケールの問題を回避しています。

于 2015-06-02T23:27:44.727 に答える
0

そのようなことは常にサーバー時間で確認することをお勧めします。

以下の手順に従ってください。

  1. サーバー時刻を取得し、現在のロケールに変換します。

  2. 現在のロケールを使用してモバイル時間を確認します。

  3. それらが同じでない場合、それはユーザーが時間を変更したことを意味します。

これが明確かどうか教えてください。

于 2015-03-12T11:34:17.977 に答える