1. ホーム
  2. ios

[解決済み] iPhone 最後に画面をタッチしてからの非アクティブ時間/アイドル時間の検出

2022-04-27 13:39:03

質問

一定時間ユーザーが画面に触れなかった場合、特定のアクションを取るような機能を実装した方はいらっしゃいますか?最適な方法を考えているのですが。

UIApplicationには、こんなややこしいメソッドがあるんです。

[UIApplication sharedApplication].idleTimerDisabled;

その代わり、こんな感じだといいですね。

NSTimeInterval timeElapsed = [UIApplication sharedApplication].idleTimeElapsed;

そして、タイマーを設定してこの値を定期的にチェックし、ある閾値を超えたら何らかのアクションを起こすことができるのです。

私が求めているものが説明できていればいいのですが。この問題に取り組まれた方、またはどのように行うかについて何かお考えがありますか?ありがとうございます。

解決方法は?

ここに私が探していた答えがあります。

アプリケーションデリゲートをUIApplicationのサブクラスとする。実装ファイルでは、sendEvent: メソッドを以下のようにオーバーライドします。

- (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event];

    // Only want to reset the timer on a Began touch or an Ended touch, to reduce the number of timer resets.
    NSSet *allTouches = [event allTouches];
    if ([allTouches count] > 0) {
        // allTouches count only ever seems to be 1, so anyObject works here.
        UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
        if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded)
            [self resetIdleTimer];
    }
}

- (void)resetIdleTimer {
    if (idleTimer) {
        [idleTimer invalidate];
        [idleTimer release];
    }

    idleTimer = [[NSTimer scheduledTimerWithTimeInterval:maxIdleTime target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO] retain];
}

- (void)idleTimerExceeded {
    NSLog(@"idle time exceeded");
}

ここで、maxIdleTimeとidleTimerはインスタンス変数です。

これを動作させるには、UIApplicationMainにデリゲートクラス(この例ではAppDelegate)を主クラスとして使用するようにmain.mを修正する必要もあります。

int retVal = UIApplicationMain(argc, argv, @"AppDelegate", @"AppDelegate");