当电源线断开时,NSTimer在后台停止

时间:2013-09-30 12:31:50

标签: iphone objective-c cocoa-touch ios7

我已经创建了GPS基础应用程序。

在哪个应用程序中每1秒记录一次GPS数据。 App使用NSTimer每秒获取GPS数据。 这个NSTimer是在后台开始的。当应用程序收到APNS的静默推送通知时,NSTimer即启动。 我在iOS 7中看到一个问题,那时当手机连接电源线时,定时器呼叫正常,但没有连接电源线计时器在应用程序在后台停止。

解决此问题的任何输入都非常感谢。

2 个答案:

答案 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播放时间间隔。请参考主菜单 - >调试 - >模拟后台提取