在后台和Nstimer工作时遇到问题?

时间:2011-08-25 13:08:53

标签: iphone objective-c nstimer background-process

您好我已经开始使用Nstimer和后台进程开发应用程序。

我已经用计时器实现了后台进程。它是令人兴奋的好。但是当我第一次最小化应用程序时,我有问题,那时它没有运行后台进程。最小化应用3至4次后。之后它运作顺利。我还会显示后台任务和计时器的代码,如下所示。

 - (void)applicationDidEnterBackground:(UIApplication *)application {

    UIApplication*    app = [UIApplication sharedApplication];
    NSLog(@"Application enter in background");
    [NSTimer scheduledTimerWithTimeInterval:2.0f
                                     target:self
                                   selector:@selector(updateCounter:)
                                   userInfo:nil
                                    repeats:YES]; 
}

我的updateCounter方法如下:

    - (void)updateCounter:(NSTimer*)timer {

    NSString *id = [[UIDevice currentDevice] uniqueIdentifier];
    NSLog(@"uniqueid:%@",id);

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation];

    CLLocation *location = [locationManager location];

    // Configure the new event with information from the location
    CLLocationCoordinate2D coordinate = [location coordinate];

    NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude]; 
    NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];

    NSLog(@"dLatitude : %@", latitude); 
    NSLog(@"dLongitude : %@",longitude);

}

他们的任何问题相关代码请帮我解决。

3 个答案:

答案 0 :(得分:4)

当应用处于后台状态时,

NSTimer会暂停。

你必须开始一些后台任务才能做你想做的事。但即便如此,在将应用程序置于后台后,您将被限制在一定的时间内。

仅为位置跟踪,VoIP或音频应用授予实际后台行为。 其他应用必须面临限制:一旦在后台,您将有足够的时间来完成以beginBackgroundTaskWithExpirationHandler:backgroundTimeRemaining)开头的任务。

iOS Application Programming Guide, Executing Code in the Background中描述了整个事情,特别是here

答案 1 :(得分:3)

首先:当您的应用进入后台时,定时器无法按预期工作。 (取决于运行循环的可用性和超时)

从我从代码中收集到的内容,您似乎希望在应用程序在后台运行时进行位置更新。为此,您应该从这里查看指南: https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW24

  

有几种方法可以在后台跟踪用户的位置,   其中一些实际上并不涉及定期运行   背景:

     
      
  • 应用程序可以注册重要的位置更改。   (推荐)重大变化的位置服务提供了一个   低功耗方式接收位置数据,强烈建议   不需要高精度位置数据的应用程序。有了这个   服务,位置更新仅在用户的位置生成   变化显着;因此,它非常适合社交应用或   为用户提供非关键,位置相关的应用程序   信息。如果在更新发生时暂停应用程序,   系统在后台唤醒它以处理更新。如果   应用程序启动此服务,然后终止系统   当新位置变为时,自动重新启动应用程序   可用。此服务仅适用于iOS 4及更高版本   包含蜂窝无线电的设备。
  •   
  • 应用程序可以继续   使用标准的位置服务。虽然不打算跑步   无限期地在后台,标准的位置服务是   适用于所有iOS版本,并提供通常的更新   应用程序正在运行,包括在后台运行时。   但是,一旦应用程序暂停或更新,更新就会停止   终止,新的位置更新不会导致应用程序   被唤醒或重新启动。这种服务适用于   位置数据主要用于应用程序所在的位置   前景。
  •   
  • 应用程序可以声明自己需要连续   后台位置更新。需要定期的应用程序   应该添加前景和后台的位置更新   它的Info.plist文件的UIBackgroundModes键并设置值   包含位置字符串的数组的此键。这个选项是   适用于提供特定服务的应用程序,例如   导航服务,涉及让用户了解他或他的   她在任何时候的位置。钥匙的存在   应用程序的Info.plist文件告诉系统它应该允许   应用程序在后台根据需要运行。
  •   
     

鼓励你   使用重要的位置变更服务或使用标准   服务节俭。位置服务需要主动使用iOS   设备的板载无线电硬件。持续运行此硬件   可以消耗大量的电力。如果您的应用程序   不需要提供精确和连续的位置信息   用户,最好使用那些最小化功率的服务   消费。这些低功率服务中的主要是重要的   iOS 4中引入的位置更改服务。此服务提供   定期更新位置,甚至可以唤醒背景   应用程序,或重新启动已终止的应用程序,以提供它们。

     

对于需要定期更精确位置数据的应用程序   间隔,如导航应用程序,您需要声明   申请作为连续背景申请。这个选项是   适用于真正需要它的应用程序,但它是最少的   理想的选择,因为它大大增加了用电量。

答案 2 :(得分:3)

检查您的应用何时进入后台模式以及何时进入foregroud,计算此差异并在计时器中添加已用时间,以便获得大约总时间。我也实现了相同的功能,并且我的工作非常好。