NSTimer无法在后台运行

时间:2014-10-07 16:02:54

标签: ios objective-c nstimer

我有一个问题,当应用程序在后台工作时,我的NSTimer不起作用。 在模拟器上它是工作,在设备上它不是。

我在AppDelegate.m上的代码:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"enter background");

    notiTimer = [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(checkNotification) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:notiTimer forMode:NSDefaultRunLoopMode];
}

和我试图在循环中运行的方法:

 -(void)checkNotification {

    NSLog(@"running loop in bg");

    userdetails =[NSUserDefaults standardUserDefaults];
    userid = [userdetails objectForKey:@"userid"];
    username = [userdetails objectForKey:@"username"];
    if (userid != NULL && username != NULL) {

        notifString = [NSString stringWithFormat:@"userid=%@", userid];
        notifData = [NSData dataWithBytes: [notifString UTF8String] length: [notifString length]];
        urlreq = [[NSMutableURLRequest alloc] initWithURL:notifUrl];
        [urlreq setHTTPMethod: @"POST"];
        [urlreq setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
        [urlreq setHTTPBody: notifData];
        sendreq = [NSURLConnection sendSynchronousRequest:urlreq returningResponse:nil error:nil];
        response =[[NSString alloc] initWithBytes:[sendreq bytes] length:[sendreq length] encoding:NSUTF8StringEncoding];
        responsTrimmed = [response stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        splitResponse = [responsTrimmed componentsSeparatedByString: @","];
        if ([splitResponse[0] isEqualToString:@"1"]) {
            NSLog(@"%@",splitResponse[1]);
        }
        else {
            NSLog(@"err");
        }
    }

}

现在一旦在应用程序进入后台我得到调试器NSLog:

  NSLog(@"enter background");

但是运行循环不起作用,并且该方法不会在循环中调用,而且我没有得到NSLog

NSLog(@"running loop in bg");

关于调试器,有什么想法吗?

1 个答案:

答案 0 :(得分:5)

当你的应用程序进入后台时,它会被冻结"通过操作系统,所以不能以正常方式执行任务。 应用程序本身应声明它如何处理后台任务,但您仅限于以下情况之一:

  • 你需要一点时间(通常不到10分钟):你可以简单地要求它
  • 您的应用正在下载内容:您可以要求系统继续为您下载
  • 可以在后台执行一小组任务,但您必须在项目中指定它

因此,为了执行某些代码,您必须在退出时启动后台任务

Here is the Apple documentation用于后台执行,希望它能为您提供帮助。