在后台运行iOS App超过10分钟

时间:2013-04-16 07:25:48

标签: ios objective-c background background-process

我试图让我的应用程序在后台运行超过10分钟,根据这个和我的好在下面。 (我想使用长时间运行来跟踪位置,我的代码只是使用计数器进行测试) 任何人都可以帮助指出问题所在?

  

实施长时间运行的后台任务

     

对于需要执行更多执行时间的任务,您必须这样做   请求特定权限,以便在后台运行它们   他们被停职了。在iOS中,只允许使用特定的应用类型   在后台运行:

     

在后台播放用户可听内容的应用,   比如音乐播放器应用

     

随时向用户通知其位置的应用,例如   导航应用

     

支持互联网协议语音(VoIP)的应用

     

需要下载和处理新内容的报亭应用程序   从外部配件接收定期更新

     

实施这些服务的应用必须声明他们的服务   支持和使用系统框架来实现相关方面   那些服务。声明服务可以让系统知道哪个   您使用的服务,但在某些情况下,它是系统框架   实际上会阻止您的申请被暂停。

   - (void)viewDidLoad {
             [super viewDidLoad];

        counterTask = [[UIApplication sharedApplication]
                       beginBackgroundTaskWithExpirationHandler:^{

                       }];
                count=0;

        theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1
                                                  target:self
                                                selector:@selector(countUp)
                                                userInfo:nil
                                                 repeats:YES];
         }
    - (void)countUp {

        {
            count++;
            NSString *currentCount;
            currentCount=[[NSString alloc] initWithFormat:@"%ld",count];
            theCount.text=currentCount;
            [currentCount release];
        }
        }

另一个问题:我可以永远在后台运行iOS应用程序吗?

----编辑代码添加位置,仍然没有运行超过10分钟,对我做错了什么帮助?

- (void)viewDidLoad {
     [super viewDidLoad];

 count=0;

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;

 [locationManager startUpdatingLocation];

counterTask = [[UIApplication sharedApplication]
               beginBackgroundTaskWithExpirationHandler:^{
                   // If you're worried about exceeding 10 minutes, handle it here

                   [locationManager startUpdatingLocation];
               }];
theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1
                                          target:self
                                        selector:@selector(countUp)
                                        userInfo:nil
                                         repeats:YES];

 }



     (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
 NSLog(@"OldLocation %f %f", oldLocation.coordinate.latitude, oldLocation.coordinate.longitude); NSLog(@"NewLocation %f %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);

    count++; NSString *currentCount;
 currentCount=[[NSString alloc] initWithFormat:@"%ld",count];
 theCount.text=currentCount; [currentCount release];
 }

    (void)countUp { [locationManager startUpdatingLocation];
 { count++; NSString *currentCount; 
currentCount=[[NSString alloc] initWithFormat:@"%ld",count]; 
theCount.text=currentCount;
 [currentCount release]; } }

4 个答案:

答案 0 :(得分:4)

因此,您的应用使用了位置服务。那么请阅读Location Awareness Programming Guide

您需要对Info.plist进行一些更改:

  • 如果您的应用依赖于位置服务才能正常运行,请将location-services添加到UIRequiredDeviceCapabilities
  • 如果您的应用需要GPS硬件,请将gps添加到UIRequiredDeviceCapabilities
  • 如果您需要在后台运行超过10分钟的应用,请将location添加到UIBackgroundModes。然后,您的位置经理将提供超过10分钟限制的位置。
  • 您还应该设置NSLocationUsageDescription(也可以本地化)
  

在后台获取位置事件

     

如果您的应用需要提供位置更新,无论该应用是否在   前景或背景,这样做有多种选择。该   首选选项是使用重要的位置更改服务   在适当的时间唤醒您的应用以处理新事件。但是,如果   您的应用需要使用标准位置服务,您可以声明   您的应用需要后台位置服务。

     

应用程序应仅在缺席时请求后台位置服务   这些服务会削弱其运作能力。此外,   任何请求后台位置服务的应用都应该使用它们   服务为用户提供切实的利益。例如,a   转弯导航应用程序可能是背景的候选人   位置服务,因为它需要跟踪用户的位置和   报告何时进行下一轮。

答案 1 :(得分:1)

有关详细信息,请参阅phix23的答案(和文档),但在此我想解释一下您可能会发生什么。

这些都是您引用的文档中的所有内容。

任何应用程序都可以在后台运行长达十分钟。这就是beginBackgroundTaskWithExpirationHandler:方法的作用。无论你设置哪个标志和选项,都可以使用该方法。

对于需要跟踪位置的应用,您可以使用CLLocationManager。只要您愿意,这不允许您的应用在后台运行。相反,它会在有趣的事情发生时通知您 - 这就是委托的用途。因此,您不能保证每隔十分钟就会调用countUp方法,但当用户将手机移动一定距离时,可以让操作系统调用它。

答案 2 :(得分:1)

通过在applicationDidEnterBackground方法中添加以下内容,它似乎可以永久执行:

[app beginBackgroundTaskWithExpirationHandler:^{}];

然后,您在willEnterForeground

中使长任务无效

我最近在iOS 6中取得了成功,但我不确定它是否会被批准用于商店。

答案 3 :(得分:0)

顺便说一下,在你的plist中你也可以设置Required background modes然后在第0项App registers for location updates

中设置