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

时间:2010-09-21 16:04:59

标签: iphone objective-c ios4 background-process keep-alive

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

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

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

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

更新:在this tutorial中,我发现Acrobits在Apple Store上有两个应用程序,“可以强制应用程序在后台保持活跃状态​​”。那么有办法做到这一点吗?

6 个答案:

答案 0 :(得分:31)

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

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

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

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

Capabilities tab in XCode 5 您可以找到more about this in Apple documentation

答案 1 :(得分:18)

您可以在应用程序指向后台后的有限时间内执行任务,但仅限于提供的持续时间。运行时间超过此时间将导致您的应用程序终止。有关如何解决此问题,请参阅“iOS应用程序编程指南”的“Completing a Long-Running Task in the Background”部分。

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

  

多任务应用程序只能使用   为他们的目的服务   用途:VoIP,音频播放,   位置,任务完成,本地   通知等

答案 2 :(得分:7)

如果任何后台任务运行超过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");
        }

答案 3 :(得分:3)

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

即使这样也不会使应用程序“完全正常运行”,但仅限于有限的API。

答案 4 :(得分:2)

取决于它的作用。如果你的应用程序占用太多内存,或者不应该调用函数/类,SpringBoard可能会终止它。但是,它很可能会被Apple拒绝,因为它没有遵循它们的7种背景用途。

答案 5 :(得分:1)

可能是链接将帮助bcz你可能必须在应用程序运行的后台方法中实现Appdelegate中的代码。 另请参阅developer.apple.com网站以获取应用程序类 Here是在后台运行应用

的链接