0

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

其中 App 每 1 秒记录一次 GPS 数据。应用程序使用 NSTimer 每秒获取 GPS 数据。这个 NSTimer 在后台启动。NSTimer 在应用程序收到来自 APNS 的静默推送通知时启动。我在 iOS 7 中看到了一个问题,即当手机连接电源线时,定时器会正确调用但没有连接电源线,而应用程序在后台时定时器会停止。

非常感谢任何解决此问题的意见。

4

2 回答 2

3

如果NSTimer您的应用不在前台,则不能保证触发。拔下电缆后,系统会将您的应用程序置于后台以节省电池。

不支持使用 anNSTimer方法来获取位置数据。CLLocationManager当有新位置时,您将告诉其代表。无需轮询。

如果您需要在后台跟踪地理位置,则需要从 Xcode 5 目标设置的功能选项卡中将位置更新声明为后台模式。否则,一旦您的应用不在前台,您的位置管理器将停止提供位置更新。

于 2013-09-30T12:44:56.457 回答
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 玩时间间隔。请参考 Main Menu->Debug->Simulate Background Fetch

于 2014-05-23T12:05:24.630 回答