2009-09-20 25 views
27

que utiliza este código para realizar un seguimiento de último reinicio:Lo que se basa en el iPhone mach_absolute_time

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

asumí mach_absolute_time() se basó en el momento del arranque último dispositivo como si fuera en un mac. No parece estar basado en eso. De hecho, no tengo idea de en qué se basa.

Mira el siguiente comportamiento (la fecha de hoy es 2009-09-20):

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

Estoy absolutamente seguro de que no reiniciar el dispositivo en ese momento. Mi dispositivo no se ha iniciado en una semana.

Además, cuando desengancho mi dispositivo del cable y ejecuto esta aplicación, parece que cuando el dispositivo se queda dormido, el último reinicio comienza a cambiar en el futuro. Parece que mach_absolute_time no mantiene la cuenta del tiempo de inactividad. ¿O estoy equivocado acerca de esto?

Realmente me gustaría poder obtener una marca de tiempo desde el último dispositivo reiniciado. ¿Algunas ideas?

+0

que pueda #include "CAHostTimeBase.h" de CoreAudio Utility Classes, consulte https://developer.apple.com/library/ios/qa/qa1643/_index.html –

Respuesta

44

Tuve algunos problemas con esto yo mismo. No hay mucha documentación buena, así que fui con la experimentación. Esto es lo que pude determinar:

mach_absolute_time depende del procesador del dispositivo. Devuelve tics desde que se reinició el dispositivo por última vez (también conocido como tiempo de actividad). Para obtenerlo en una forma legible por humanos, debe modificarlo por el resultado de mach_timebase_info (una razón), que devolverá una billonésima de segundos (o nanosegundos). Para que esto sea más fácil de usar que utilizo una función como la siguiente:

#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

Parece que su experimentación resultó en la misma solución a la que llegaron los ingenieros de Apple. https://developer.apple.com/library/mac/qa/qa1398/_index.html – user371320

+0

En este último caso parece ser para OSX. – JohnK

+3

Esta función funciona incorrectamente para iOS. En la cadena de retorno, realiza el cálculo del valor entero. Como en iPhone 5 s_timebase_info.numer = 125 y s_timebase_info.denom = 3 finalmente puede obtener el mismo tiempo de actividad durante aproximadamente 40 segundos entre las solicitudes. Multiplique mach_absolute_time() por float 1.0 para corregirlo. – malex

8

Si no se preocupan mucho de tiempo de cálculo se puede utilizar sencilla clase Obj-C de la Fundación

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

¿qué quiere decir con "tiempo de finalización"? – Eddy

+1

Disculpe la ortografía incorrecta, "tiempo de cálculo". Quiero decir que obj-c funciona un poco más lento que el código C puro. – malex

+0

Gracias @malex :) – Eddy

Cuestiones relacionadas