30


18

前回の再起動を追跡するためにこのコードを使用します。

(float)secondsSinceLastReboot {return((float)(mach_absolute_time()))*((float)timebase.numer)/((float)timebase.denom)/ 1000000000.0f; }

私はmach_absolute_time()は、Mac上のように最後のデバイス起動時間に基づいていると仮定しました。 それに基づいているようには思われません。 それが何に基づいているのか、私は実際にはわかりません。

次の動作を確認してください(今日の日付は2009-09-20です)。

lastRebootTime = [[NSDate date] addTimeInterval: -  [self secondsSinceLastReboot]];
//last Reboot Time will contain : 2009-09-20 07:42:14 +0100

当時私は自分のデバイスを再起動しなかったことは間違いない。 私のデバイスは1週間で起動しませんでした。

さらに、デバイスをケーブルから外してこのアプリを実行すると、デバイスがスリープ状態になると、lastRebootTimeが将来シフトし始めます。 mach_absolute_timeはスリープ時間を考慮に入れていないようです。 それとも私はこれについて間違っていますか?

デバイスが最後に再起動したときからタイムスタンプを取得できるようにしたいです。 何か案は?

2 Answer


47


これで私自身に問題がありました。 良いドキュメントはそれほど多くないので、実験を続けました。 これが私が判断できたものです:

mach_absolute_timeはデバイスのプロセッサによって異なります。 デバイスが最後に再起動されてからのティックを返します(アップタイムとも呼ばれます)。 人間が読める形式にするためには、mach_timebase_infoからの結果(比率)で修正する必要があります。これにより、10億分の1秒(またはナノ秒)が返されます。 これをより使いやすくするために、私は以下のような関数を使います。

#含める

int getUptimeInMilliseconds(){const int64_t kOneMillion = 1000 * 1000; static mach_timebase_info_data_t s_timebase_info;

static dispatch_once_t onceToken; dispatch_once(

// mach_absolute_time()は10億分の1秒を返します。//ミリ秒を取得するために100万で除算します。return(int) }


9


計算時間をあまり気にしないのであれば、Foundationの単純なObj-Cクラスを使うことができます。

NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];