36

首先,我知道只支持 voip、音频和定位应用程序在后台运行,并且它们将在播放音频或使用定位服务等时运行。

我想知道的是,是否有办法让我的应用程序在后台完全运行,不管对电池寿命的影响。

这样,我的应用程序的用户可以从设置中进行选择,以在他想要的时候让应用程序保持活动状态,并且只在他希望的时间内保持活动状态。例如,如果他正在等待需要运行应用程序的东西,则在收到消息后,他可以关闭保持活动功能。

我不知道这是否可能,但我读过一些这样说的帖子,但不幸的是他们没有说如何 =(

更新:在本教程中,我发现 Acrobits 在 Apple Store 上有两个应用程序“可以强制应用程序在后台保持活动和唤醒”。那么有办法做到这一点吗?

4

6 回答 6

33

从 IOS 7 开始,应用程序在后台运行有更新的方式。苹果现在认识到应用程序必须不断地不断下载和处理数据。

这是可以在后台运行的所有应用程序的新列表。

  1. 在后台向用户播放有声内容的应用程序,例如音乐播放器应用程序
  2. 在后台录制音频内容的应用程序。
  3. 让用户随时了解其位置的应用程序,例如导航应用程序
  4. 支持互联网协议语音 (VoIP) 的应用程序
  5. 需要定期下载和处理新内容的应用
  6. 从外部配件接收定期更新的应用程序

您可以使用 X Code 5+ 在 Info.plist 中声明应用程序支持的后台任务。例如。将 UIBackgroundModes 键添加到您应用的 Info.plist 文件中并向数组添加一个 'fetch' 值可以让您的应用定期从网络下载和处理少量内容。您可以在 XCode 5 的应用程序属性的“功能”选项卡中执行相同操作(附加快照)

XCode 5 中的功能选项卡 您可以在 Apple 文档中找到更多相关信息

于 2013-09-23T08:13:34.587 回答
21

在您的应用程序被引导到后台后,您可以在有限的时间内执行任务,但仅限于提供的持续时间。运行时间超过此时间将导致您的应用程序终止。请参阅iOS 应用程序编程指南的“在后台完成长时间运行的任务”部分以了解如何进行此操作。

其他人则将在后台播放音频作为后台进程保持活力的一种手段,但苹果只会在音频播放是合法功能的情况下接受这样的应用程序。Apple 已发布的审查指南第 2.16 条规定:

多任务应用程序只能将后台服务用于其预期目的:VoIP、音频播放、位置、任务完成、本地通知等

于 2010-09-21T17:30:19.563 回答
8

如果任何后台任务运行时间超过 10 分钟,则该任务将被挂起,并调用 beginBackgroundTaskWithExpirationHandler 指定的代码块来清理该任务。后台剩余时间可以通过 [[UIApplication sharedApplication] backgroundTimeRemaining] 检查。最初,当应用程序处于前台时,backgroundTimeRemaining 设置为更大的值。当应用程序进入后台时,您可以看到 backgroundTimeRemaining 值从 599.XXX(1o 分钟)减少。一旦 backgroundTimeRemaining 变为零,后台任务将被挂起。

        //1)Creating iOS Background Task
        __block UIBackgroundTaskIdentifier background_task;
        background_task = [application beginBackgroundTaskWithExpirationHandler:^ {

               //This code block is execute when the application’s 
               //remaining background time reaches ZERO.
          }];


        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            //### background task starts

            //#### background task ends
        });

        //2)Making background task Asynchronous
        if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
        {
            NSLog(@"Multitasking Supported");

            __block UIBackgroundTaskIdentifier background_task;
            background_task = [application beginBackgroundTaskWithExpirationHandler:^ {

                //Clean up code. Tell the system that we are done.
                [application endBackgroundTask: background_task];
                background_task = UIBackgroundTaskInvalid;
            }];


        **//Putting All together**
            //To make the code block asynchronous
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                //### background task starts
                NSLog(@"Running in the background\n");
                while(TRUE)
                {
                    NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
                    [NSThread sleepForTimeInterval:1]; //wait for 1 sec
                }
                //#### background task ends

                //Clean up code. Tell the system that we are done.
                [application endBackgroundTask: background_task];
                background_task = UIBackgroundTaskInvalid; 
            });
        }
        else
        {
            NSLog(@"Multitasking Not Supported");
        }
于 2013-07-09T17:27:03.390 回答
3

要在现有的 iOS 设备上运行,请将您的应用程序设为音频播放器/录音机或 VOIP 应用程序、提交到 App Store 的合法应用程序,或者仅供您自己使用的假冒应用程序。

即使这样也不会使应用程序“完全可操作”,而是仅限于有限的 API。

于 2010-09-21T16:35:46.077 回答
2

取决于它做什么。如果您的应用程序占用了太多内存,或者调用了不应调用的函数/类,SpringBoard 可能会终止它。但是,它很可能会被 Apple 拒绝,因为它不遵循他们的 7 个背景用途。

于 2010-09-21T16:35:10.617 回答
1

可能是链接将帮助 bcz 您可能必须在 Appdelegate 中实现 Appdelegate 中的代码 in app run in background method .. 另请参阅 developer.apple.com 站点以获取应用程序类 是在后台运行应用程序的链接

于 2011-07-21T05:12:03.627 回答