1

アプリケーションがサーバー時間を常に表示する iPod Touch 用の iOS アプリケーションを開発しています。サーバーへの Web サービス呼び出しを行ってアプリケーションがフォアグラウンドになるたびに、常にアプリケーションの時刻をサーバーの時刻と同期させます。サーバーとクライアント間の接続が数時間失われると、アプリケーションの時刻を同期できなくなります。アプリケーションがバックグラウンドにある場合、iOS はタイマーの実行をサポートしていないことを読みました。

  • 音楽プレーヤー アプリなど、バックグラウンドでユーザーに可聴コンテンツを再生するアプリ
  • ナビゲーション アプリなど、常にユーザーに現在地を知らせるアプリ
  • Voice over Internet Protocol (VoIP) をサポートするアプリ
  • 新しいコンテンツをダウンロードして処理する必要がある Newsstand アプリ
  • 外部アクセサリから定期的にアップデートを受信するアプリ

では、どうすれば申請時間を追跡できますか? ユーザーがアプリケーションに切り替えるたびに、サーバー時間を確認する必要があるため、タイマーを実行して、最後に同期されたサーバー時間を更新する必要があります。

4

3 に答える 3

1

他の回答を組み合わせて、との組み合わせを使用して、サーバー時刻を取得し、アプリケーションがサーバーに最後に同期された時刻維持するクラスを作成します。例えば:NSDate* lastSyncapplicationDidBecomeActive

-(void)applicationDidBecomeActive:(UIApplication*)application {
  [ServerTimeSync sharedInstance] resync];
}

ServerTimeSync はNSDate*、最後の同期時間でプロパティを維持します (サーバーが提供するものを に変換する必要がありますNSDate*)。

于 2012-07-10T01:46:20.820 に答える
0

NSDateアプリがバックグラウンドになったときに保存できます。再開したら、NSDate再び現在を取得し、保存されたサーバー時間に差を追加します。

于 2012-07-10T01:39:59.397 に答える
0

これにはタイマーはまったく必要ありません。

サーバーと時間を同期するときは、現在の UNIX タイムスタンプを返すようにすることをお勧めします。その後、次のことができます。

[[NSDate date] timeIntervalSince1970];

...デバイスの現在の UNIX タイムスタンプを取得します。次にできることは、これら 2 つのタイムスタンプの差を保存することです。これは、サーバー時間とデバイス時間の間のクロック スキューです。

デバイスの現在の UNIX タイムスタンプを取得し、それにクロック スキューを追加することで、サーバーのおおよその時間を計算できるようになりました。表示するときにタイムゾーンを調整して(必要に応じて)、完了です。サーバーと時刻を同期するときはいつでも、保存されているクロック スキュー値を更新するだけです。

さらに凝りたい場合は、クロック スキューを決定する際に、ネットワーク レイテンシを測定して考慮に入れることもできます。

このアプローチは、サーバーの絶対タイムスタンプを保存してから、タイマー (またはその他のメカニズム) を使用して経過時間を追跡するよりもはるかにうまく機能するはずです。

于 2012-07-10T01:42:42.163 に答える