0

我有一些测试代码用于让我的应用程序保持在后台状态下运行,这在 iOS 5.1 模拟器上运行良好,但在实际设备上表现不佳。

现在我已经知道我必须遵循的要求,所以我将“背景模式”设置为 voip 和位置。

在我的委托的 applicationDidEnterBackground 方法中,我正在调用以下函数,我称之为“doBackgroundActivity()”来请求应用程序在后台完成一些长时间运行的任务的时间:

-(void) threadedMethod{    
while(true){
    NSLog(@"looping");            
    [self showLocalNotification:@"This notification will come every 2 min. if the app is running in background. Close it!"];        
    [NSThread sleepForTimeInterval: (5)];        // 60 sec = 1 min
}

}

    -(void) doBackgroundActivity{
        self->_backgroundTask = [ [UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
                [[UIApplication sharedApplication] endBackgroundTask: self->_backgroundTask];
                self->_backgroundTask = UIBackgroundTaskInvalid;
            }
        ];


        [self threadedMethod];



[[UIApplication sharedApplication] endBackgroundTask:self->_backgroundTask];
    self->_backgroundTask = UIBackgroundTaskInvalid;
}

如您所见,doBackgroundAcitivity() 只是调用 threadedMethod() 并且所做的只是运行一个无限循环,该循环每 5 秒左右发送一次本地通知。

现在在模拟器中,当我运行它并最小化应用程序时,我每隔 5 秒左右就会看到一个通知。即使当我运行其他应用程序时,应用程序也会继续在后台运行,我看到我的应用程序正在发送通知。

但这不会在设备上发生。看起来操作系统在发送第一个通知后立即终止了应用程序,并且我没有看到我希望稍后看到的任何后续通知?

我还需要做些什么来让应用程序在后台运行吗?

4

1 回答 1

0

如果您要做的只是在您的应用关闭时向用户显示通知,您应该使用UILocalNotifications

您可以设置通知何时触发,是否应该重复,以及重复之间的时间量。

作为旁注,我不建议在循环中使用 sleep() 来控制代码何时执行,因为它会阻止线程执行任何操作,并且不利于任何其他想要使用该线程的任务. 相反,您应该使用 NSTimers 和其他控制代码执行时间的方法。

于 2012-06-15T04:27:38.997 回答