2016-03-24 15 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ソリューションを求めるときは、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()) 

それは少しきれいに、私たちが代わりにsysctlsysctlbynameを使用することができますようにするには:

// 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コードを呼び出すことができます:Getting iOS system uptime, that doesn't pause when asleep

print(SystemUtil().uptime()); 

はあなたが言及した受け入れ答えのようにObjCクラスを記述します。

インタフェースのための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 

そして、あなたは(スウィフトからにObjCクラスを使用できるように、次の内容の<Project>-Bridge-Header.hを含めることを忘れないでください<Project>はプロジェクト名です):

#import "SystemUtil.h" 
+0

OPはネイティブのSwiftソリューションを求めています。 – JAL

+0

これは機能します。おもう。これは妥当なゼロ以外の稼働時間を示しています。 Xcodeで.hと.mファイルを作成し(ファイル - >新規 - >ファイル - > iOS->ソース)、@ donghua-liを入れてください#importを追加するだけです。 – TimSim

+0

@TimSim [pure-Swiftソリューション](http://stackoverflow.com/a/36204651/4912403)を試しました。 。 –

0

これは何 `ちょうど約スウィフト4.

var boottime = timeval() 
var size = MemoryLayout<timeval>.stride 
sysctlbyname("kern.boottime", &boottime, &size, nil, 0) 
関連する問題