在后台运行应用程序超过10分钟

时间:2012-03-16 13:52:11

标签: ios background-process

我试图让iOS应用在进入后台状态时保持活动状态超过10分钟。

我该如何实现呢。

7 个答案:

答案 0 :(得分:56)

请参阅iPhoneAppProgrammingGuide的“后台执行”部分。简而言之,您的应用必须是以下类型之一:

  • 在后台播放用户可听内容的应用,例如音乐播放器应用
  • 随时向用户通知其位置信息的应用,例如导航应用
  • 支持互联网协议语音(VoIP)的应用
  • 需要下载和处理新内容的报亭应用
  • 从外部附件接收定期更新的应用

您必须按如下方式添加到Info.plist: 将UIBackgroundModes键添加到您的 Info.plist文件并将其值设置为包含以下一个或多个字符串的数组:

  • audio-应用程序在后台播放可听内容给用户。 (此内容包括使用AirPlay播放音频或视频内容。)
  • 位置 - 该应用可让用户随时了解其位置,即使它在后台运行也是如此。
  • voip-该应用程序使用户能够使用Internet连接拨打电话。
  • 报亭 - 内容 - 该应用程序是一个下载和处理杂志或报纸的新闻应用程序 内容在后台。
  • external-accessory-该应用程序适用于需要在a上提供更新的硬件配件 通过外部附件框架定期安排。
  • bluetooth-central-该应用程序可与需要提供更新的蓝牙配件配合使用 通过CoreBluetooth框架定期安排

请注意,部分审核流程会检查以确保您的应用能够完成与后台处理相关的操作。

答案 1 :(得分:20)

以下是我使用beginBackgroundTaskWithExpirationHandler完成的工作。

  • 编写一个启动后台任务的方法。
  • 在该后台任务中,运行NSTimer,计划(非重复)时间不超过10分钟。出于我的情况,我使用了5分钟。
  • 一旦NStimer的选择器触发,结束后台任务,然后立即调用您之前编写的方法开始另一个后台任务。
  • 如果要安排在特定时间运行的方法,则必须在后台任务中检查它们。

这个解决方案并不是很理想,但仍然会耗电,但会做你想做的事。

编辑:自iOS7以来,我建议您阅读此excellent post

答案 2 :(得分:2)

只允许在后台运行某些类型的应用。请参阅this guide的“实施长时间运行的后台任务”部分。

如果您没有请求权限进行后台处理,您可以使用UIApplication的beginBackgroundTaskWithExpirationHandler,但是您无法获得额外的时间。

答案 3 :(得分:2)

此代码使您的iOS应用程序在后台无限期运行。将以下方法复制并粘贴到单件/管理器中,该单件/管理器处理您需要在后台执行的任务。

// @interface

// Declare Private property
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;

//@end
// ...

// Copy into
//@implementation 

- (void)setupBackgrounding {
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appBackgrounding:)
                                                 name: UIApplicationDidEnterBackgroundNotification
                                               object: nil];
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appForegrounding:)
                                                 name: UIApplicationWillEnterForegroundNotification
                                               object: nil];
}

- (void)appBackgrounding: (NSNotification *)notification {
    [self keepAlive];
}

- (void) keepAlive {
    self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
        [self keepAlive];
    }];
}

- (void)appForegrounding: (NSNotification *)notification {
    if (self.backgroundTask != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }
}

答案 4 :(得分:1)

https://github.com/yarodevuci/backgroundTask在这里检查我的代码我正在使用播放空白wav文件的音频播放器在IOS 8上完美运行24小时内电池使用率约为10% 使用方法:

var backgroundTask = BackgroundTask()
backgroundTask.startBackgroundTask() //Starts playing blank audio file. You can run NSTimer() or whatever you need and it will continue executing in the background.

backgroundTask.stopBackgroundTask() //Stops the task

警告:如果您尝试提交,Apple会拒绝此操作!

答案 5 :(得分:0)

你做不到。除非您的应用使用音频,voip或gps。您可以做的是通知用户(通过本地通知)时间快到了并要求他打开/关闭应用程序。

此外,如果您只需要通知用户,则可以使用推送通知。

答案 6 :(得分:0)

如果您的应用类型不是VOIP /音频/位置....(请查看Background Modes),

或者您不希望将应用程序指定为后台应用程序,您可以实现 beginBackgroundTaskWithName:expirationHandler beginBackgroundTaskWithExpirationHandler 以请求更多时间来运行您的进程背景。您可以找到详细说明here

  

移动到后台的应用程序有望尽快进入静止状态,以便系统可以暂停它们。如果您的应用程序处于任务中间并且需要一些额外时间来完成该任务,则它可以调用beginBackgroundTaskWithName:expirationHandler:或beginBackgroundTaskWithExpirationHandler:UIApplication对象的方法来请求一些额外的执行时间。调用这些方法中的任何一种都会暂时延迟暂停您的应用程序,从而为完成其工​​作提供一些额外的时间。完成该工作后,您的应用必须调用endBackgroundTask:方法让系统知道它已完成并可以暂停。

     

对beginBackgroundTaskWithName的每次调用:expirationHandler:或beginBackgroundTaskWithExpirationHandler:方法生成一个唯一的令牌以与相应的任务相关联。当您的应用程序完成任务时,它必须使用相应的令牌调用endBackgroundTask:方法,以让系统知道任务已完成。未能为后台任务调用endBackgroundTask:方法将导致应用程序终止。如果在启动任务时提供了过期处理程序,系统将调用该处理程序并为您提供最后一次结束任务并避免终止的机会。