自动锁定ios设备,NSTimer和scheduledTimerWithTimeInterval

时间:2013-08-23 10:03:21

标签: ios nstimer auto-lock

我想在一段时间后(生产时间为30分钟)触发操作,现在我正在使用NSTimer s scheduledTimerWithTimeInterval。在测试期间(超时为20秒,而不是1800秒)一切似乎都很好。在debbuging模式下(从XCode运行)一切似乎都很好,因为设备没有自动锁定。但在现实生活中,当应用程序在设备上运行时,自动锁定(精确自动锁定,触发锁定按钮不会)“冻结”计时器(或者至少将计时器触发器以某种方式移动到未来)。

我可以处理这种情况吗?当然我可以在UIApplication sharedApplication中禁用idleTimer但是当应用程序进入后台模式时,ipad仍然可以自动锁定。

2 个答案:

答案 0 :(得分:2)

其实你可以,

首先,为NSUserDefaults创建“startTimeOfMyExoticTimer”的默认值:

[[[NSUserDefaults] standardDefaults] setObject:[NSDate date] forKey:@"startTimeOfMyExoticTimer"];

然后踢一个计时器来检查有效时间范围是否结束:

[NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(checkIfTimeIsOver) userInfo:nil repeats:YES];

然后实施您的检查方法:

-(void)checkIfTimeIsOver{
     NSDate * now = [NSDate date];
     NSDate * startTime = [[NSUserDefaults standardDefaults] objectForKey:@"startTimeOfMyExoticTimer"];

     // Here compare your now and startTime objects. (subsract them) and see the difference between them. If your time range is to be set on 30 seconds. Then you should check if the time difference between those objects are bigger than 30 seconds.

}

即使设备已锁定,应用程序处于后台等状态,此功能也将正常工作。

这种方法对我有用,希望它对你也有用

答案 1 :(得分:0)

//Implement this block help your application run background about 10 minutes    

@interface AppDeledate(){
     UIBackgroundTaskIdentifier backgroundTaskId;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // if missing interval exist > start timer again and set missing interval to 0
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
        NSLog(@"Did Enter Background");

        backgroundTaskId = [application beginBackgroundTaskWithExpirationHandler:^{
            NSLog(@"Background Task Expired !!!\n");

            [application endBackgroundTask:backgroundTaskId];
            backgroundTaskId = UIBackgroundTaskInvalid;
                    //save missing interval to NSUserDefault
        }];
    }

    - (void)applicationWillEnterForeground:(UIApplication *)application
    {
        NSLog(@"Will Enter Foreground");

        if (backgroundTaskId && backgroundTaskId != UIBackgroundTaskInvalid) {
            [application endBackgroundTask:backgroundTaskId];



    backgroundTaskId = UIBackgroundTaskInvalid;
        }

    }