【问题标题】:Running iOS App in background for more than 10 minutes在后台运行 iOS App 超过 10 分钟
【发布时间】:2013-04-08 12:12:00
【问题描述】:

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

【问题讨论】:

  • 如果您的应用程序不属于这些类别之一,那么您已经指定了可以在后台运行的应用程序,那么如果运气好的话,您就出局了。不是没有办法让你的应用程序永远在后台运行。 Apple 不会允许这样做,因为它会缩短电池寿命。作为用户,我也不想要这样的应用程序。为什么你的应用需要一直运行???
  • 当我测试代码后台任务仅停留 10 分钟时,它确实属于特定类别(让用户始终了解其位置的应用程序,例如导航应用程序),我应该也使用该位置进行测试,而不仅仅是计数器?
  • 如果你的应用在后台使用位置,你应该启动CLLocationManager来接收主要的位置变化。然后,当用户更改位置时,您的应用会收到通知。
  • 谢谢,现在测试一下,告诉你会发生什么
  • rckoenes,我用包含 cllocation 的新代码编辑了问题,请帮助我做错了什么,谢谢

标签: ios objective-c background background-process


【解决方案1】:

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

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

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

在后台获取位置事件

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

只有在缺席的情况下,应用才应请求后台定位服务 这些服务中的一些会损害其运营能力。此外, 任何请求后台位置服务的应用程序都应该使用那些 为用户提供切实利益的服务。例如,一个 转弯导航应用程序可能是背景的候选者 定位服务,因为它需要跟踪用户的位置和 报告下一次转弯的时间。

【讨论】:

  • 谢谢你的回复,我做了你写的修改,但我不知道怎么做最后一点(你还应该设置NSLocationUsageDescription(也可以本地化))请检查我上面的代码谢谢非常感谢您的帮助
  • 非常感谢,问题已解决:D
【解决方案2】:

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

这几乎都包含在您引用的文档中。

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

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

【讨论】:

  • 非常感谢,问题已解决:D
【解决方案3】:

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

[app beginBackgroundTaskWithExpirationHandler:^{}];

那么你就让willEnterForeground中的长任务失效了。

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

【讨论】:

  • 绝对不会被批准进入商店。不错的技巧!
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多