我试图让iOS应用在进入后台状态时保持活动状态超过10分钟。
我该如何实现呢。
答案 0 :(得分:56)
请参阅iPhoneAppProgrammingGuide的“后台执行”部分。简而言之,您的应用必须是以下类型之一:
您必须按如下方式添加到Info.plist: 将UIBackgroundModes键添加到您的 Info.plist文件并将其值设置为包含以下一个或多个字符串的数组:
请注意,部分审核流程会检查以确保您的应用能够完成与后台处理相关的操作。
答案 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:方法将导致应用程序终止。如果在启动任务时提供了过期处理程序,系统将调用该处理程序并为您提供最后一次结束任务并避免终止的机会。