Uygulamam için oturum etkinliğini uygularım, böylece kullanıcı 30 saniye boyunca etkin değilse, onu bir form sayfası olarak yeni bir kullanıcı denetleyicisine gösterin. Dokunmatik olay için, ben konsoldaDokunuşlar objektif olarak iki kez fark edilir.
#import "BCDTimeManager.h"
@implementation BCDTimeManager
__strong static BCDTimeManager *sharedTimerInstance = nil;
NSTimer *idleTimer;
NSTimeInterval timeinterval;
+ (BCDTimeManager*)sharedTimerInstance
{
static dispatch_once_t predicate = 0;
dispatch_once(&predicate, ^{
sharedTimerInstance = [[self alloc] init];
NSString *timeout = [[NSUserDefaults standardUserDefaults] valueForKey:@"session_timeout_preference"];
timeinterval = [timeout doubleValue];
});
return sharedTimerInstance;
}
- (void)resetIdleTimer {
if (idleTimer) {
[idleTimer invalidate];
}
idleTimer = nil;
NSLog(@"timeout is %ld",(long)timeinterval);
idleTimer = [NSTimer scheduledTimerWithTimeInterval:timeinterval target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:true];
}
- (void)idleTimerExceeded {
NSLog(@"idle time exceeded");
[[NSNotificationCenter defaultCenter]
postNotificationName:@"ApplicationTimeout" object:nil];
}
Ama ekranlarda herhangi dokunuş yaptığınızda, ben uygulayan bir tekil sınıf resetIdleTimer ve idleTimerExceed yöntemidir BCDTimeManager sınıfında bu kodu
(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) {
[[BCDTimeManager sharedTimerInstance]resetIdleTimer];
}
}
}
kullanıyorum NSLog'un NSNOtification eylemimin iki kez tetiklenmesine neden olan iki kez yazdırıldığını görebiliyorum.
Neyi yanlış yaptığımı bilmiyorum. Lütfen bunu anlamama yardım et.
içine bakacağım '' 'resetIdleTimer''' '' '' idleTimer''' tanımlıyorsunuz? Bana öyle geliyor ki “idleTimer invalidate]' 'dediğinizde mevcut değil. – docksteaderluke
IdleTimer'i tanımlamak için kodu güncelledim – Nitya
Bir şey rootViewController'da NSNotification gözlemcisi ekliyorum ve kullanıcı oturumu kapattığında gözlemci kaldırıyorum. Gözlemcilerin düzgün bir şekilde kaldırılmaması ve bildirimin iki kez eklenmesine neden olması mümkündür. – Nitya