所以,我希望我的应用程序只在固定的时间内执行后台执行 ,这是因为用户没有手动停止应用程序,因此理论上应用程序可以运行永远的背景(甚至可能吗?)。
我使用下面的代码(只是一个测试应用程序)来测试一个后台任务在结束之前可以运行多长时间。我读到某个地方,10分钟是我们可以做背景执行的最长时间,并且没有办法超越(?)。但是,我的代码只会在后台执行3分钟。
总结我的问题:
2.我有类似的其他选择吗? (实际应用程序我需要这个实现,在后台接收位置更新,用户可以在后台长达30分钟,并突然没有收到更新将是坏的)
- (void)viewDidLoad {
[super viewDidLoad];
counterTask = [[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^{
// do something }];
count=0;
theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(countUp)
userInfo:nil
repeats:YES];
}
- (void)countUp {
if (count==10000) {
[theTimer invalidate];
[[UIApplication sharedApplication] endBackgroundTask:counterTask];
} else {
NSLog(@"asd");
count++;
NSString *currentCount;
currentCount=[[NSString alloc] initWithFormat:@"%d",count];
_theCount.text=currentCount;
long seconds = lroundf([[UIApplication sharedApplication] backgroundTimeRemaining]);
NSLog([NSString stringWithFormat:@"%ld",seconds]);
}
}
答案 0 :(得分:1)
我在某处读到10分钟是我们可以执行后台执行的最长时间,并且没有办法超越(?)。但是,我的代码只能在后台执行3分钟。
是的,你是正确的iOS 7 iOS允许应用程序在后台执行最多10分钟,但是自iOS 7以来他们已经将这个时间减少到180秒。
但是,如果您想在后台获取位置更新,则可以在Required Background modes
文件中添加info.Plist
属性。使用此功能,您将能够在后台运行应用程序以获取位置更新Apple将在审核您的应用程序商店提交时检查您的请求,因此请务必仅在您将其用于实际目的时才使用此模式。
以下是苹果允许后台执行的各种模式,您可以在Apples Doc on background execution
查看它
修改强>
如果您希望在用户转到backGround后的特定时间内停止获取位置更新,则可以执行此操作
- (void)applicationDidEnterBackground:(UIApplication *)application {
[self performSelector:@selector(stopGettingLocationUPdates) withObject:nil afterDelay:1800];
}
-(void)stopGettingLocationUPdates{
[self.locationManager stopUpdatingLocation]
}
这将在30分钟后停止更新。
答案 1 :(得分:0)
您的代码未在后台运行。它没有测试你想要测试的东西。
Apple的docs说:
在后台应用程序中执行有限长度任务 过渡到后台可以请求额外的时间 完成任何重要的最后一分钟任务。要求背景 执行时间,打电话给 beginBackgroundTaskWithName:expirationHandler:方法 UIApplication类。
您指定的实际时间未指定,可能是根据功耗,内存需求等特别决定的。它们可能是最大值。
他们接着说:
实现长时间运行的后台任务适用于需要更多任务的任务 要执行的执行时间,您必须请求特定的权限 在后台运行它们而不会被暂停。仅在iOS中 允许特定的应用类型在后台运行:
- 在后台播放用户可听内容的应用,例如音乐播放器应用
- 在后台录制音频内容的应用。
- 随时向用户通知其位置信息的应用,例如导航应用
- 支持互联网协议语音(VoIP)的应用
- 需要定期下载和处理新内容的应用
- 从外部附件接收定期更新的应用 实现这些服务的应用程序必须声明它们支持的服务,并使用系统框架来实现相关方面 那些服务。声明服务可以让系统知道哪个 您使用的服务,但在某些情况下,它是系统框架 实际上会阻止您的申请被暂停。