在iOS / Swift中获得系统正常运行时间

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

当你要求一个纯粹的Swift解决scheme时,我将你所提到的答案中的ObjC代码转换成了获得iOS系统正常运行时间的东西,在睡觉时不会暂停 。

 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) 

你可以从Swift中调用ObjC代码:

 print(SystemUtil().uptime()); 

写一个ObjC类,就像你提到的接受的答案: 获得iOS系统的正常运行时间,睡觉时不会暂停 。

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" 

这是Swift 4中的一个解决scheme。

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