6

我试图让我的应用程序在后台运行超过 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

4 回答 4

4

所以你的应用使用了定位服务。然后请阅读位置感知编程指南

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

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

在后台获取位置事件

如果您的应用需要在前台或后台提供位置更新,则有多种选择。首选选项是使用重大位置更改服务在适当的时间唤醒您的应用程序以处理新事件。但是,如果您的应用需要使用标准位置服务,您可以将您的应用声明为需要后台位置服务。

仅当缺少这些服务会影响其运行能力时,应用程序才应请求后台位置服务。此外,任何请求后台定位服务的应用程序都应该使用这些服务为用户提供切实的好处。例如,逐向导航应用程序可能是后台定位服务的候选者,因为它需要跟踪用户的位置并报告下一个转弯的时间。

于 2013-04-16T08:10:01.537 回答
1

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

您引用的文档中几乎涵盖了所有这些内容。

任何应用程序都可以在后台运行长达十分钟。这就是该beginBackgroundTaskWithExpirationHandler:方法的作用。无论您设置了哪些标志和选项,这就是您使用该方法获得的全部内容。

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

于 2013-04-16T08:15:50.937 回答
1

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

[app beginBackgroundTaskWithExpirationHandler:^{}];

然后您使willEnterForeground.

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

于 2013-08-21T13:29:45.670 回答
0

顺便说一句,在您的 plist 中,您可以设置Required background modes然后在 Item0App registers for location updates

于 2013-04-16T08:23:05.697 回答