2016-03-24 16 views
1

Gibt es eine Möglichkeit, Systemverfügbarkeit in iOS zu erhalten (mit Swift)? Was ich brauche, ist Zeit zu messen, ohne sich darum sorgen zu müssen, dass der Benutzer die Zeit ändert. In Android gibt es eine elapsedCurrentTimeMillis(), die die Anzahl der Millisekunden seit dem Start zurückgibt, aber jetzt brauche ich so etwas für iOS. Es gibt eine akzeptierte Antwort hier Getting iOS system uptime, that doesn't pause when asleep aber das ist für Objective C und ich brauche es für Swift und ich weiß nicht, wie man es umwandelt.Systemverfügbarkeit in iOS/Swift erhalten

+0

Was ist nur ' NSProcessInfo.processInfo(). SystemUptime'? – JAL

+0

Die Schlafzeit wird nicht berücksichtigt. Ich brauche einen Weg, zuverlässig zu messen, wie viel Zeit vergangen ist, auch wenn die App in der Zwischenzeit heruntergefahren wird und auch wenn der Benutzer die Zeit ändert. – TimSim

Antwort

7

Als Sie nach einer reinen Swift-Lösung fragen, konvertierte ich den ObjC-Code aus der Antwort, die Sie erwähnten Getting iOS system uptime, that doesn't pause when asleep.

func uptime() -> time_t { 
    var boottime = timeval() 
    var mib: [Int32] = [CTL_KERN, KERN_BOOTTIME] 
    var size = strideof(timeval) 

    var now = time_t() 
    var uptime: time_t = -1 

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

// print(uptime()) 

Um es ein bisschen schöner, wir sysctlbyname statt sysctl verwenden:

// var mib: [Int32] = [CTL_KERN, KERN_BOOTTIME] 
sysctlbyname("kern.boottime", &boottime, &size, nil, 0) 
+2

@ JAL Ich debuggte und fand das unterschiedliche Verhalten der Größe zwischen ObjC und Swift heraus. Es funktioniert jetzt! –

+0

Yup, das funktioniert, zeigt den gleichen Wert wie Objective-C-Code-Version! Und ich kann sehen, dass ich mich schwer programmieren werde ... – TimSim

2

können Sie ObjC Code von Swift nennen:

print(SystemUtil().uptime()); 

eine ObjC Klasse schreiben wie die akzeptierte Antwort, die Sie erwähnt: Getting iOS system uptime, that doesn't pause when asleep.

SystemUtil.h für Schnittstelle:

#import <Foundation/Foundation.h> 

@interface SystemUtil : NSObject 

- (time_t)uptime; 

@end 

SystemUtil.m für die Implementierung:

#import "SystemUtil.h" 
#include <sys/sysctl.h> 

@implementation SystemUtil 

- (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; 
} 

@end 

Und vergessen Sie nicht, ein <Project>-Bridge-Header.h mit folgendem Inhalt enthalten, so dass Sie die ObjC Klasse von Swift verwenden (<Project> ist Ihr Projektname):

#import "SystemUtil.h" 
+0

Das OP bittet um eine native Swift-Lösung. – JAL

+0

Das funktioniert. Ich denke. Es zeigt plausible Nicht-Null-Betriebszeit. Für alle, die so dumm sind wie ich, müssen Sie nur die .h und .m Dateien in Xcode erstellen (Datei-> Neu-> Datei ...-> iOS-> Quelle) und sie in @donghua-li einfügen schrieb, und Bridge-Header.h wird automatisch erstellt (also einfach den #import hinzufügen) – TimSim

+0

@TimSim Ich habe eine [pure-Swift-Lösung] ausgearbeitet (http://stackoverflow.com/a/36204651/4912403) . –

0

Dies ist eine Lösung in Swift 4.

var boottime = timeval() 
var size = MemoryLayout<timeval>.stride 
sysctlbyname("kern.boottime", &boottime, &size, nil, 0)