12

我正在制作一个仅用于测试目的的基准应用程序。我不打算将其转到 App Store。

当然,我需要的是我的 NSTimer 使用 UIBackgroundTaskIdentifier 在后台继续运行,将数据保存到 Core Data db,最后将数据推送到服务器(我正在使用 Parse),当然。

所以基本上,我没有发现任何适用于我的具体案例的问题。我这样设置我的 NSTimer:

    UIBackgroundTaskIdentifier bgTask;
UIApplication  *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask]; 
}];

self.timer = [NSTimer scheduledTimerWithTimeInterval:self.localInterval target:self selector:@selector(updateCoreData:) userInfo:nil repeats:YES];

updateCoreData 方法只是调用 Core Data 类并进行必要的插入。

我已经阅读了有关 VoIP 和音乐播放部分的信息,但不知道哪一个最适合我的情况,也不知道如何实现它们。

4

2 回答 2

38

我自己想通了,对于其他有类似问题的人,我所做的是首先打开 Info.plist 文件上的位置更新标志。为此,您必须在 Xcode 4 上添加名为“Required Background Modes”的键,然后作为值,选择“App registers for location updates”

我在我的 .h 文件中有一个像这样声明的计时器:

NSTimer *silenceTimer;
@property (nonatomic, retain) NSTimer *silenceTimer;

然后在 .m 文件上,我这样声明:

UIBackgroundTaskIdentifier bgTask;
UIApplication  *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask]; 
}];
self.silenceTimer = [NSTimer scheduledTimerWithTimeInterval:300 target:self
selector:@selector(startLocationServices) userInfo:nil repeats:YES];

最后,在选择器方法上,我做了以下事情:

-(void)startLocationServices {
    [locationManager startUpdatingLocation];
    [locationManager stopUpdatingLocation];
}

这将创建一个计时器,在 5 分钟后启动并立即停止定位服务。这足以让应用程序无限期地保持活动状态,除非您终止该进程。

于 2012-03-08T19:18:26.530 回答
2

XCode 6.3.1,适用于 iOS 8.3

我在应用程序之间遇到了很大的差异。使用调试器和相同的应用程序插入运行 XCode 的 Mac 时的行为。拔下电源时的行为。

在当前的 iOS 版本 8.3 中,您的应用最多被分配 180 秒的时间在后台运行,用于具有过期处理程序的有限长时间运行任务。

无论您尝试什么,拔下手机后,您的应用程序将在 180 秒或更早的时间内被系统杀死。我已经进行了大量的测试和技巧来确认这一点。看我的帖子...

我的 NSTimer 帖子

这是一个简洁的方法来告诉您的应用程序在终止之前还剩下多少时间运行,请记住,您不能保证这次。

NSTimeInterval backgroundTimeRemaining = [[UIApplication sharedApplication] backgroundTimeRemaining];

if (backgroundTimeRemaining == DBL_MAX)
{
    NSLog(@"background time remaining = undetermined");
}
else
{
    NSLog(@"background time remaining = %0.2f sec.", backgroundTimeRemaining);
}

希望这有助于您的调查。干杯!

于 2015-06-25T21:33:58.563 回答