5

私のアプリケーションは、mach_absolute_time を使用して最後のタッチ イベント以降のティックを計算し、10 分のアイドル時間制限を超えるとユーザーをログアウトさせます。

これはすべて iOS 6 では正常に動作しますが、iOS 7 では正しく動作していないことに気付きました。具体的には、iOS 7 デバイスが (バッテリで) 取り外されると、次のようにスリープ状態になると、デバイスは目盛りの増加を停止するようです。コンソールの次の行 (これは、非アクティブ状態が約 5 分間続くと発生します):

powerd[47] : スリープ: BATT を使用 (充電: 99%)

したがって、10 分後にデバイスを起動し、mach_absolute_time を使用してティックを計算すると、差はわずか 5 分であることがわかります (実際には 10 分経過しています)。

奇妙なことに、すべてが正常に機能し、デバイスが電源に接続されているとティックが実行され続けます。デバイスが接続されている場合、デバイスがコンソール ログでスリープ状態になることは決して示されません (ただし、画面はオフになり、動作はプラグを抜いた場合と視覚的に同じになります)。

これも clock_get_time を使用して試しましたが、同じ問題に直面しています。

デバイスがスリープ状態になったときに Mach 絶対時間を刻み続けるために iOS 7 でできることはありますか? [[NSDate date] timeIntervalSince1970]ユーザーがシステム時間を操作してこれをバイパスできるため、使用したくありません。

洞察をありがとう。

4

1 に答える 1

2

mach_absolute_time() のデフォルトの動作は、デバイスがスリープ状態になるとティックを停止することです。iOS 6 では、アプリをbeginBackgroundTaskWithExpirationHandler. ただし、iOS 7 では、これに許可される最大時間は 3 分に制限されています (これは を呼び出すことでわかりますbackgroundTimeRemaining)。これが、iOS 7 ではクロックが停止していたのに、iOS 6 では停止していなかった理由です。

今日、この答えに出くわしました。これは有望に思えます。

- (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;
}

time() は、デバイスがスリープしている間もインクリメントを続けますが、もちろん、オペレーティング システムまたはユーザーが操作できます。ただし、システム クロックが変更されると、カーネルの起動時間 (システムが最後に起動されたときのタイムスタンプ) も変更されるため、これらの値は両方とも固定されていませんが、それらの間のオフセットは固定されています。

于 2013-11-07T18:50:15.367 に答える