【问题标题】:NSTimer stops in Background while power cable is disconnected断开电源线时,NSTimer 在后台停止
【发布时间】:2013-09-30 12:31:50
【问题描述】:

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

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

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

【问题讨论】:

  • 你读过 iOS 7 中的后台管理(以及为什么要默默记录位置数据??)
  • NSTimer 就是这样工作的。当应用程序处于后台时它会停止。

标签: iphone objective-c cocoa-touch ios7


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    只有少数几个用例可以在前台实现。如果您不希望您的申请在审核期间被拒绝,请不要使用任何黑客手段。当然,你可以在后台使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多