在iOS / Swift

时间:2016-03-24 15:15:34

标签: ios swift

有没有办法让iOS系统正常运行(使用Swift)?我需要的是测量时间而不必担心用户改变时间。在Android中有一个elapsedCurrentTimeMillis(),它返回自启动以来的毫秒数,但现在我需要类似iOS的东西。这里有一个可接受的答案Getting iOS system uptime, that doesn't pause when asleep,但那是针对Objective C的,我需要它用于Swift,我不知道如何转换它。

4 个答案:

答案 0 :(得分:11)

当你要求一个纯粹的Swift解决方案时,我从你提到的答案转换了ObjC代码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())

为了让它更漂亮,我们可以使用sysctlbyname代替sysctl

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

答案 1 :(得分:4)

这是Swift 4中的解决方案。

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

答案 2 :(得分:2)

你可以从Swift调用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中包含以下内容,以便您可以使用Swift中的ObjC类(<Project>是您的项目名称):

#import "SystemUtil.h"

答案 3 :(得分:0)

已针对Swift 5进行了更新,并直接从ADF帖子here

func bootTime() -> Date? {  
    var tv = timeval()  
    var tvSize = MemoryLayout<timeval>.size  
    let err = sysctlbyname("kern.boottime", &tv, &tvSize, nil, 0);  
    guard err == 0, tvSize == MemoryLayout<timeval>.size else {  
        return nil  
    }  
    return Date(timeIntervalSince1970: Double(tv.tv_sec) + Double(tv.tv_usec) / 1_000_000.0)  
}

“请注意,如果系统时钟发生更改,此时间将更改,即该值是相对于当前系统时钟的启动时间。”