如何让在后台运行的iPhone应用程序完全正常运行

Pau*_*l N 32 iphone objective-c keep-alive background-process ios4

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

我想知道的是,如果有办法让我的应用程序在后台运行完全正常运行,那么对电池寿命的影响无关紧要.

这样,我的应用程序的用户可以从设置中进行选择,以便随时随地保持应用程序,并且只需要他想要的时间.例如,如果他正在等待需要应用程序运行的内容,则在收到消息后,他可以关闭保持活动功能.

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

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

Pra*_*evu 31

从ioS 7开始,应用程序可以在后台运行更新的方式.Apple现在认识到应用程序必须不断地下载和处理数据.

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

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

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

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


Bra*_*son 20

您可以在将应用程序指向后台后的有限时间内执行任务,但仅限于提供的持续时间.运行时间超过此时间将导致您的应用程序终止.有关如何解决此问题,请参阅" iOS应用程序编程指南"中的" 完成背景中的长时间运行任务 "部分.

其他人背负着在背景中播放音频作为后台进程保持活力的手段,但如果音频播放是合法的功能,Apple将只接受这样的应用程序.关于Apple发布的审核指南的第2.16项规定:

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


Sab*_*esh 8

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

        //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");
        }
Run Code Online (Sandbox Code Playgroud)