有没有办法让iOS系统正常运行(使用Swift)?我需要的是测量时间而不必担心用户改变时间。在Android中有一个elapsedCurrentTimeMillis()
,它返回自启动以来的毫秒数,但现在我需要类似iOS的东西。这里有一个可接受的答案Getting iOS system uptime, that doesn't pause when asleep,但那是针对Objective C的,我需要它用于Swift,我不知道如何转换它。
答案 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)
}
“请注意,如果系统时钟发生更改,此时间将更改,即该值是相对于当前系统时钟的启动时间。”