我有一个问题,当应用程序在后台工作时,我的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");
关于调试器,有什么想法吗?
答案 0 :(得分:5)
当你的应用程序进入后台时,它会被冻结"通过操作系统,所以不能以正常方式执行任务。 应用程序本身应声明它如何处理后台任务,但您仅限于以下情况之一:
因此,为了执行某些代码,您必须在退出时启动后台任务。
Here is the Apple documentation用于后台执行,希望它能为您提供帮助。