iPhone/iPadの時刻を定期的にntpdateで調節するTimeServerClient
2016/03/16
価値ある情報をユーザー視点で発信するブログ
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」という項目が増えます。
インストールはいつものNew野良リポジトリ。
「TimeServerClient」という名前で登録してあります。検索を。
無保証です。何の保証もありません。それでもよければ使ってみてください。
なお、このパッケージに含まれるntpdateはiphone-app-ntpdateのものを使用させていただきました。