J'utilise ce code pour garder une trace du dernier redémarrage:
+ (float) secondsSinceLastReboot{
return ((float)(mach_absolute_time())) * ((float)timebase.numer) / ((float)timebase.denom) / 1000000000.0f;
}
J'ai supposé que mach_absolute_time () était basé sur le dernier temps de démarrage de l'appareil comme il est sur un Mac. Cela ne semble pas être basé sur cela. En fait, je n'ai aucune idée de ce qu'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 n'ai pas redémarré mon appareil à ce moment-là. Mon appareil n'a pas été démarré dans une semaine.
En outre, lorsque je décroche mon appareil dans le câble et exécutez cette application, il semble que lorsque l'appareil se couche en veille, le Lastreboottime commence à déplacer à l'avenir. Il semble que Mach_Absolute_Time ne garde pas compte pour le temps de veille. Ou je me trompe à ce sujet?
J'aimerais vraiment pouvoir obtenir un horodatage de l'appareil lorsque l'appareil a été redémarré. Des idées?
Eu des problèmes avec cela moi-même. Il n'y a pas beaucoup de bonne documentation, alors je suis allé avec expérimentation. Voici ce que j'ai pu déterminer:
mach_absolute_Time dépend du processeur de l'appareil. Il renvoie des ticks car l'appareil a été redémarré (autrement connu sous le nom de disponibilité). Afin de l'obtenir sous une forme lisible humaine, vous devez le modifier par le résultat de Mach_TimeBase_info (un ratio), qui retournera le milliardième de secondes (ou nanosecondes). Pour que cela soit plus utilisable, 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));
}
Si vous ne vous souciez pas beaucoup de temps de calcul, vous pouvez utiliser une classe OBJ-C simple de la fondation
NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];
Si quelqu'un en ait besoin dans Swift (fonctionne dans 4.2 & 5.0).
let beginTime = mach_absolute_time()
// do something...
var baseInfo = mach_timebase_info_data_t(numer: 0, denom: 0)
if mach_timebase_info(&baseInfo) == KERN_SUCCESS {
let finiTime = mach_absolute_time()
let nano = (finiTime - beginTime) * UInt64(baseInfo.numer) / UInt64(baseInfo.denom)
}