ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

iPhone/iPadの時刻を定期的にntpdateで調節するTimeServerClient

      2016/03/16

iOS 4.0から自動的な時刻合わせがサポートされましたが、iOS 4.0以下のiPhone OSでは、時刻合わせが行なわれる機会は限られているようです。iOS4.0以上でも、任意のタイミング、任意の回数自動時刻合わせをすることはできません。

ということで、GoogleのHTTPヘッダの時刻をシステムに適用する、DTAdjusterなる時刻合わせのソフトウェアを作ったことがあるのですが、これはHome画面にあるアイコンからアプリケーションを起動して時刻合わせするものでした。これはこれで、どれぐらいずれていたのか表示されるので、なかなか楽しいものだと思っていました。

しかしながら、勝手に時刻合わせされてほしい、というニーズがあるようなので、設定した時間間隔ごとにバックグラウンドでntpdateを起動して時刻合わせをするTimeServerClientというものを作ってみました。(続きは[MORE]から)

基本的にはlaunchdでntpdateを呼び出しているだけですが、それだけでは少々問題があるので、ntpdateの実行のお膳立てをしています。

最初の問題は、launchdから定期実行をかけても、iPhoneがスリープ中はlaunchdが止まってしまうことです。
60分間隔で実行をかけようと、launchdから60分間隔で起動していては、タイミングが合わないと実行し損なうこととなります。
iPhoneを使っている間にlaunchdの実行タイミングが訪れないといけないため、launchdからの実行間隔は短くせざるを得ません。
だからといって、1分間隔などにし、毎分ntpdateを実行してはサーバに迷惑がかかります。
launchdからは毎分実行しながらも、一定時間経過しなければntpdateが実行されない、という形にするためにTimeServerClientが間に立つマネージャの役割を担っています。
launchdからはTimeServerClientを1分間隔で実行しています。設定した時間が過ぎたら、TimeServerがntpdateを実行します。

次なる問題は、C言語のレイヤーからネットアクセスをしても3Gがオンラインにならないことです。
3Gしかない場合、通常のアプリを使うなどで3Gがオンラインになってくれない限りntpdateが時刻合わせをすることができません。
TimeServerClientでは、事前にFoundationのAPIでネットアクセスをして3Gをオンラインにしています。

最後の問題は、リトライです。
FoundationのAPIでネットアクセスをして3Gをオンラインにするよう取り計らい、それでもネットワークが確立しない場合があります。Wi-Fi、3G共に圏外という場合です。
圏外の場合も1回の実行、とカウントしてしまうと、これまた時刻合わせの機会を逃すことが多くなります。
ntpdateが正常に実行されない場合は、最終実行時刻の情報を更新せずに実行を終了します。
すると、launchdから1分後にTimeServerClientが起動されたときに、リトライが実施されます。
つまり、ntpdateが正常に実行されるまで、1分間隔でリトライが繰り返されます。

これがTimeServerClientのやっていることです。

設定

インストールすると、「設定→TimeServerClient」という項目が増えます。

  • Enabled: デフォルトではオフになっていてntpdateが実行されません。Enabledをオンにして初めて実行されるようになります
  • Server Address: リストからntpサーバを選択できます
  • Custom Server Address: Server Addressのリストに希望のntpサーバが無い場合に使います。Server AddressでCustom Server Addressという項目を選択した上でCustom Server Address欄にサーバのアドレスを入力します
  • Update Interaval: 実行間隔を設定します。実行間隔といっても、最短の間隔ということになります。実際の実行タイミングは一言では説明できません。前述の説明を参考にしてください。「実際に時刻合わせがされるかどうか心配だ。テストをしたい」というニーズのために「1 min」という項目がありますが、サーバの迷惑になりますので、実運用でこの設定は使わないでください。これほどの短時間で実行することに意味もありません
  • Last Status: これは設定項目ではありません。最後の実行時のステータスをログとして表示します。設定.appを一度終了しないと更新されないかもしれません

履歴

  • 0.2-1 2010.08.15 ちゃんと動いていなかったのを修正
  • 0.1-4 2010.08.04 iPhone OS 3.2.1対応パッケージ修正
  • 0.1-3 2010.07.17 インストールに失敗するのを修正

動作環境

  • iPhone OS 3.0
  • iPhone OS 3.0.1
  • iPhone OS 3.1
  • iPhone OS 3.1.2
  • iPhone OS 3.1.3
  • iPhone OS 3.2
  • iPhone OS 3.2.1
  • iPhone OS 4.0
  • iPhone OS 4.0.1
  • iPhone OS 4.0.2

インストール

インストールはいつものNew野良リポジトリ
「TimeServerClient」という名前で登録してあります。検索を。
無保証です。何の保証もありません。それでもよければ使ってみてください。

なお、このパッケージに含まれるntpdateはiphone-app-ntpdateのものを使用させていただきました。

 - iPad, iPhone, Jailbreak, ガジェット