2016-03-24 119 views
1

有沒有辦法讓iOS中的系統正常運行時間(使用Swift)?我需要的是測量時間,而不必擔心用戶改變時間。在Android中有一個elapsedCurrentTimeMillis(),它返回自引導以來的毫秒數,但現在我需要類似iOS的東西。這裏有一個可接受的答案Getting iOS system uptime, that doesn't pause when asleep但這是Objective C的,我需要它的Swift,我不知道如何轉換它。在iOS/Swift中獲取系統正常運行時間

+0

什麼只是一個解決方案' NSProcessInfo.processInfo()。systemUptime'? – JAL

+0

這沒有考慮到睡眠時間。我需要一種方法來可靠地衡量已經過了多少時間,即使應用程序在此期間關閉了,即使用戶改變了時間。 – TimSim

回答

7

當你問純粹的Swift解決方案時,我從你提到的答案Getting iOS system uptime, that doesn't pause when asleep轉換了ObjC代碼。

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()) 

爲了使它有點漂亮,我們可以使用的sysctlbyname代替sysctl

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

@JAL我調試並找出了ObjC和Swift之間sizeof的不同行爲。它現在有效! –

+0

是的,這個工程,顯示與Objective-C代碼版本相同的值!而且我可以看到我將很難編程... – TimSim

2

您可以從斯威夫特調用ObjC代碼:

print(SystemUtil().uptime()); 

寫ObjC類像你提到的接受的答案:Getting iOS system uptime, that doesn't pause when asleep

SystemUtil.h的接口:

#import <Foundation/Foundation.h> 

@interface SystemUtil : NSObject 

- (time_t)uptime; 

@end 

SystemUtil.m實施:

#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 

而且不要忘了包括一個<Project>-Bridge-Header.h有以下內容,以便您可以從斯威夫特使用ObjC類( <Project>是您的項目名稱):

#import "SystemUtil.h" 
+0

OP要求提供本地Swift解決方案。 – JAL

+0

這工作。我認爲。它顯示了合理的非零正常運行時間。對於任何一個和我一樣愚蠢的人來說,你所需要做的就是在Xcode中創建.h和.m文件(文件 - >新 - >文件 - > iOS->源代碼),並在其中放入@ donghua-li寫道,並且Bridge-Header.h會自動創建(所以只需添加#import) – TimSim

+0

@TimSim我已經制定了一個[純Swift解決方案](http://stackoverflow.com/a/36204651/4912403) 。 –

0

這是斯威夫特4

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