2011-05-18 15 views
6

¿Alguien sabría por qué estoy teniendo un tiempo de actividad extraño con el siguiente método?Tiempo de actividad congelado en iOS/iPhone

NSProcessInfo *processInfo = [NSProcessInfo processInfo]; 
NSTimeInterval systemUptime = [processInfo systemUptime]; 

Para primeros minutos, todo parece estar bien, pero cuando vuelva de las horas de aplicaciones o los laters días el tiempo de funcionamiento sigue siendo el mismo: 30min, o 1h34 ... parece congelar en un momento aleatorio. Sobre todo en el iPhone 4 (rara vez en simulador o iPad)

Podría estar relacionado con mi manera de demostrarlo:

+ (NSTimeInterval)uptime:(NSNumber **)days hours:(NSNumber **)hours mins:(NSNumber **)mins 
{ 
    NSProcessInfo *processInfo = [NSProcessInfo processInfo]; 
     //START UPTIME/////// 
    NSTimeInterval systemUptime = [processInfo systemUptime]; 
     // Get the system calendar 
    NSCalendar *sysCalendar = [NSCalendar currentCalendar]; 
     // Create the NSDates 
    NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:(0-systemUptime)]; 
    unsigned int unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; 
    NSDateComponents *c = [sysCalendar components:unitFlags fromDate:date toDate:[NSDate date] options:0]; 
     //NSString *uptimeString = [NSString stringWithFormat:@"%dd %dh %dmin", [c day],[c hour],[c minute]]; 
    *days = [NSNumber numberWithInt:[c day]]; 
    *hours = [NSNumber numberWithInt:[c hour]]; 
    *mins = [NSNumber numberWithInt:[c minute]]; 
    [date release]; 
     //END UPTIME//////// 

    return systemUptime; 
} 

Y más adelante en el código:

NSNumber *uptimeDays, *uptimeHours, *uptimeMins; 
[CJGDevice uptime:&uptimeDays hours:&uptimeHours mins:&uptimeMins]; 
NSString *uptimeString = [NSString stringWithFormat:@"%@d %@h %@min", 
          [uptimeDays stringValue], 
          [uptimeHours stringValue], 
          [uptimeMins stringValue]]; 

EDIT: después de 3 días que grabo los resultados en iPad y iPhone puedo ver que este tiempo de actividad es incorrecto, el tiempo corre demasiado lento, mientras más esperamos, más obvio es que es tarde

+0

** Hace 32 minutos ** mostró ** 2d 12h 21min ** en un iPhone4, ahora muestra ** 2d 12h 35min ** – chriscatfr

Respuesta

9

Este método hace el truco:

- (time_t)uptime 
{ 
    struct timeval boottime; 
    int mib[2] = {CTL_KERN, KERN_BOOTTIME}; 
    size_t size = sizeof(boottime); 
    time_t now; 
    time_t uptime = -1; 

    (void)time(&now);  

    if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) 
    { 
     uptime = now - boottime.tv_sec; 
    } 
    return uptime; 
} 

Gracias a Alastair Stuart para el link.

5

Ese método es la cantidad de tiempo th El sistema ha estado activo desde el arranque (no en el reloj del mundo real) y los dispositivos iOS suelen pasar mucho tiempo durmiendo. Es por eso que no está aumentando tanto como esperabas.

Fuente: http://developer.apple.com/library/ios/releasenotes/Cocoa/Foundation.html

+1

gracias! en el documento oficial todavía se dice ** "Devuelve cuánto tiempo ha pasado desde que se reinició la computadora" ** y en su enlace dicen ** "Esto devuelve la cantidad de tiempo que el sistema estuvo despierto desde el último reinicio . "**. Mientras tanto, esto se convierte en un "otro" dato útil para mantener. Veo iNet en la tienda de aplicaciones que muestra un tiempo de actividad correcto, mantendré la esperanza – chriscatfr

2

Tome un vistazo a la forma de comandos de tiempo de actividad de Darwin hace. The source is here.

La parte que desea leer es la función pr_header(), sobre todo en torno a estas líneas:

if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) { 
    uptime = now - boottime.tv_sec; 
Cuestiones relacionadas