2009-09-20 3 views
27

に基づいている私は、最後の再起動を追跡するために、このコードを使用します。それに基づいているようには見えません。私は実際それが何に基づいているのか分かりません。次の動作ではmach_absolute_time iPhone

ルック(今日の日付が2009年9月20日です):

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

私はその時点で私のデバイスを再起動しませんでした絶対に確信しています。私のデバイスは1週間で起動していません。

また、ケーブルからデバイスをアンフックしてこのアプリケーションを実行すると、デバイスがスリープ状態になると、lastRebootTimeが将来変更されるように見えます。 mach_absolute_timeはスリープ時間を考慮していないようです。または私はこれについて間違っていますか?

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

+0

することができますが、簡単なのObj-Cクラスを使用することができ、計算時間について多くのことを気にしない場合:私は、以下のいずれかのよう機能を使用して、このより使いを作成するには#include "CAHostTimeBase.h" CoreAudioユーティリティクラスから参照してください。https://developer.apple.com/library/ios/qa/qa1643/_index.html –

答えて

44

これにはいくつか問題がありました。良い文書はたくさんありませんので、私は実験に行きました。ここで私が決定できたものがあります:

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

#include <mach/mach_time.h> 

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

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     (void) mach_timebase_info(&s_timebase_info); 
    }); 

    // mach_absolute_time() returns billionth of seconds, 
    // so divide by one million to get milliseconds 
    return (int)((mach_absolute_time() * s_timebase_info.numer)/(kOneMillion * s_timebase_info.denom)); 
} 
+6

あなたの実験の結果、アップルのエンジニアが同じソリューションを入手したようです。 https://developer.apple.com/library/mac/qa/qa1398/_index.html – user371320

+0

後者はOSXのようです。 – JohnK

+3

この機能はiOSで正しく機能しません。リターン文字列では、整数値の計算を行います。 iPhone 5ではs_timebase_info.numer = 125とs_timebase_info.denom = 3となっているので、リクエスト間で約40秒間同じ稼働時間を得ることができます。 float 1.0でmach_absolute_time()を掛けてください。 – malex

8

はあなたが財団

から
NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime]; 
+0

"完了時間"とはどういう意味ですか? – Eddy

+1

ご迷惑をおかけして申し訳ありません、 "計算時間"。私はobj-cが純粋なCコードより少しゆっくりと動作することを意味します。 – malex

+0

Thanks @ malex :) – Eddy