我已经创建了GPS基础应用程序。
在哪个应用程序中每1秒记录一次GPS数据。 App使用NSTimer每秒获取GPS数据。 这个NSTimer是在后台开始的。当应用程序收到APNS的静默推送通知时,NSTimer即启动。 我在iOS 7中看到一个问题,那时当手机连接电源线时,定时器呼叫正常,但没有连接电源线计时器在应用程序在后台停止。
解决此问题的任何输入都非常感谢。
答案 0 :(得分:3)
如果您的应用不在前台,则无法保证NSTimer
无法启动。拔下电缆后,系统会将您的应用程序置于后台以节省电量。
使用NSTimer
不是获取位置数据的受支持方法。当有新位置时,您的CLLocationManager
会告知其代表。无需轮询它。
如果您需要在后台跟踪地理位置,则需要从Xcode 5目标设置的功能选项卡中将位置更新声明为后台模式。否则,一旦您的应用不在前台,您的位置管理员将停止提供位置更新。
答案 1 :(得分:0)
您可以为前台实现的用例很少。如果您不希望在审核过程中拒绝您的申请,请不要使用任何黑客。当然,您可以在后台使用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播放时间间隔。请参考主菜单 - >调试 - >模拟后台提取