2009-09-20 4 views
27

-je utiliser ce code pour garder la trace du dernier redémarrage:Ce qui est basé sur mach_absolute_time sur iPhone

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

Je supposais mach_absolute_time() a été fondée sur le dernier démarrage de l'appareil comme il est sur un mac. Cela ne semble pas être fondé sur cela. En fait, je n'ai aucune idée de quoi il est basé.

Regardez le comportement suivant (la date d'aujourd'hui est 2009-09-20):

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

Je suis absolument certain que je ne pas redémarrer mon appareil à ce moment-là. Mon appareil n'a pas été démarré depuis une semaine.

En outre, lorsque je décroche mon appareil du câble et que j'exécute cette application, il semble que lorsque l'appareil se met en veille, le paramètre lastRebootTime commence à se décaler dans le futur. Il semble que mach_absolute_time ne tient pas compte du temps de sommeil. Ou ai-je tort à ce sujet?

Je voudrais vraiment pouvoir obtenir un horodatage depuis le dernier redémarrage de l'appareil. Des idées?

+0

vous pouvez #include "CAHostTimeBase.h" de CoreAudio Utility Classes voir https://developer.apple.com/library/ios/qa/qa1643/_index.html –

Répondre

44

J'ai eu quelques problèmes avec moi-même. Il n'y a pas beaucoup de bonne documentation, alors je suis parti avec l'expérimentation. Voici ce que j'ai pu déterminer:

mach_absolute_time dépend du processeur de l'appareil. Il renvoie des ticks depuis le dernier redémarrage de l'appareil (autrement dit uptime). Pour l'obtenir sous une forme lisible par l'homme, vous devez le modifier par le résultat de mach_timebase_info (un ratio), qui retournera un milliardième de seconde (ou nanosecondes). Pour rendre plus utile que j'utilise une fonction comme celle ci-dessous:

#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

Il semble que votre expérimentation ait abouti à la même solution que celle des ingénieurs d'Apple. https://developer.apple.com/library/mac/qa/qa1398/_index.html – user371320

+0

Fwiw ce dernier semble être pour OSX. – JohnK

+3

Cette fonction ne fonctionne pas correctement pour iOS. Dans la chaîne de retour, vous faites le calcul de la valeur entière. Depuis sur iPhone 5 s_timebase_info.numer = 125 et s_timebase_info.denom = 3 enfin vous pouvez obtenir la même disponibilité pendant environ 40 secondes entre les demandes. Multipliez mach_absolute_time() par float 1.0 pour l'exactitude. – malex

8

Si vous ne se soucient pas beaucoup de temps de calcul, vous pouvez utiliser classe simple Obj-C de la Fondation

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

Que voulez-vous dire par "temps d'achèvement"? – Eddy

+1

Désolé pour misspell, "temps de calcul". Je veux dire que obj-c fonctionne un peu lentement que le code C pur. – malex

+0

Merci @malex :) – Eddy

Questions connexes