您好我已经开始使用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);
}
他们的任何问题相关代码请帮我解决。
答案 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,计算此差异并在计时器中添加已用时间,以便获得大约总时间。我也实现了相同的功能,并且我的工作非常好。