UIApplication的。后台执行一段固定的时间

时间:2014-09-15 19:52:08

标签: ios uiapplication

所以,我希望我的应用程序只在固定的时间内执行后台执行 ,这是因为用户没有手动停止应用程序,因此理论上应用程序可以运行永远的背景(甚至可能吗?)。

我使用下面的代码(只是一个测试应用程序)来测试一个后台任务在结束之前可以运行多长时间。我读到某个地方,10分钟是我们可以做背景执行的最长时间,并且没有办法超越(?)。但是,我的代码只会在后台执行3分钟。

总结我的问题:

  1. 是否可以告诉应用在后台执行x> 10分钟?
  2. 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]);
    
        }
    }
    

2 个答案:

答案 0 :(得分:1)

我在某处读到10分钟是我们可以执行后台执行的最长时间,并且没有办法超越(?)。但是,我的代码只能在后台执行3分钟。

是的,你是正确的iOS 7 iOS允许应用程序在后台执行最多10分钟,但是自iOS 7以来他们已经将这个时间减少到180秒。

但是,如果您想在后台获取位置更新,则可以在Required Background modes文件中添加info.Plist属性。使用此功能,您将能够在后台运行应用程序以获取位置更新Apple将在审核您的应用程序商店提交时检查您的请求,因此请务必仅在您将其用于实际目的时才使用此模式。

enter image description here

以下是苹果允许后台执行的各种模式,您可以在Apples Doc on background execution

查看它

Back Ground Modes

修改

如果您希望在用户转到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)的应用
  •   
  • 需要定期下载和处理新内容的应用
  •   
  • 从外部附件接收定期更新的应用   实现这些服务的应用程序必须声明它们支持的服务,并使用系统框架来实现相关方面   那些服务。声明服务可以让系统知道哪个   您使用的服务,但在某些情况下,它是系统框架   实际上会阻止您的申请被暂停。
  •