我已经创建了 GPS 基础应用程序。
其中 App 每 1 秒记录一次 GPS 数据。应用程序使用 NSTimer 每秒获取 GPS 数据。这个 NSTimer 在后台启动。NSTimer 在应用程序收到来自 APNS 的静默推送通知时启动。我在 iOS 7 中看到了一个问题,即当手机连接电源线时,定时器会正确调用但没有连接电源线,而应用程序在后台时定时器会停止。
非常感谢任何解决此问题的意见。
我已经创建了 GPS 基础应用程序。
其中 App 每 1 秒记录一次 GPS 数据。应用程序使用 NSTimer 每秒获取 GPS 数据。这个 NSTimer 在后台启动。NSTimer 在应用程序收到来自 APNS 的静默推送通知时启动。我在 iOS 7 中看到了一个问题,即当手机连接电源线时,定时器会正确调用但没有连接电源线,而应用程序在后台时定时器会停止。
非常感谢任何解决此问题的意见。
如果NSTimer
您的应用不在前台,则不能保证触发。拔下电缆后,系统会将您的应用程序置于后台以节省电池。
不支持使用 anNSTimer
方法来获取位置数据。CLLocationManager
当有新位置时,您将告诉其代表。无需轮询。
如果您需要在后台跟踪地理位置,则需要从 Xcode 5 目标设置的功能选项卡中将位置更新声明为后台模式。否则,一旦您的应用不在前台,您的位置管理器将停止提供位置更新。
您可以在前台实现的用例很少。如果您不希望您的申请在审核期间被拒绝,请不要使用任何黑客手段。当然,你可以在后台使用 NSTimer,但它必须在后台任务的线程(runloop)中创建。但是这个后台任务只存在一定的时间,所以你的计时器必须在这段时间内触发。换句话说,您的第一个目标是创建后台任务,然后您才能使用计时器。有几种情况适合您的目的(允许您创建此任务): 1.监控重大位置更改或区域 2.获取数据 (iOs 7)。所以请参考
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"BG fetch in action");
//the only 30 sec is allowed to perform all your actions
//during this period you can each second track GPS data
[self performSelector:@selector(finishBackgroundFetch:) withObject:completionHandler afterDelay:27];
[[NSNotificationCenter defaultCenter] postNotificationName:@"StartMyGPSRoutine" object:nil];
}
-(void)finishBackgroundFetch:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"BG fetch completion handler");
[[NSNotificationCenter defaultCenter] postNotificationName:@"ForceStopAnyBackgroundTaskCreatedWithStartMyGPSRoutine" object:nil];
completionHandler(UIBackgroundFetchResultNewData);
}
您的应用程序委托的 - 这将在您的情况下很有用以及监控重大的位置变化。你应该把任何地方:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(setMinimumBackgroundFetchInterval:)]) {
NSLog(@"Set Force BG interval to %ld", interval);
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:interval];
}
在我的情况下,我每 5 分钟获取一次 GPS 数据,因此完成这项任务的 27 秒并不长。无论如何,您可以使用 XCode 玩时间间隔。请参考 Main Menu->Debug->Simulate Background Fetch