IOS App不在后台运行

Posted

技术标签:

【中文标题】IOS App不在后台运行【英文标题】:IOS App does not run in background 【发布时间】:2013-09-05 16:26:52 【问题描述】:

我希望我的应用程序音频在后台运行,我关注了this tutorial,但它不起作用。当我按下主页按钮时,我的应用程序音频仍然停止,并且我意识到它没有调用“applicationDidBecomeActive”或“applicationDidEnterBackground”(即使我禁用了“应用程序不在后台运行”设置,问题仍然存在)。过去一周我一直在处理这个问题。

到目前为止,我已经完成了这些步骤:

-添加了AVFoundation框架并声明了

#import <AVFoundation/AVFoundation.h>

-在音频中设置AVAudiosession

NSString *audioName = [NSString stringWithFormat:@"audio%d", (nimages)];
        NSString *soundPath =[[NSBundle mainBundle]pathForResource:audioName ofType:@"mp3"];
        NSURL *soundURL = [NSURL fileURLWithPath:soundPath];
        NSError *error = nil;
        AVAudioPlayer *audio = nil;
        audio = [[AVAudioPlayer alloc]initWithContentsOfURL:soundURL error:&error];
        audio.numberOfLoops = -1;
        audio.volume = 0.9;
        if (error) 
            NSLog(@"%@", [error localizedDescription]);
            NSLog(@"Unable to load file");                
        else 
            //Make sure the system follows our playback status
            [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
            [[AVAudioSession sharedInstance] setActive: YES error: nil];
            //Load the audio into memory
            [audio prepareToPlay];
        

-在plist中添加行

更新:

我的应用程序是一个音频应用程序,即使它进入后台,用户也可以播放我的应用程序的特定配乐。有可能吗?

【问题讨论】:

【参考方案1】:

我认为它必须主动播放音频才能正常工作。如果您的应用程序实际上不是音频应用程序,您可以尝试将应用程序设置为 VoIP;这不需要活动连接。它也不会阻止其他想要使用音频的应用程序。只需将后台模式设置为“应用程序提供IP语音服务”,然后它会在后台运行一次最多十分钟;如果你想让它保持活动状态或唤醒它,你可以连接一个 VoIP 套接字并将内容推送到它。

【讨论】:

我认为我的应用程序考虑了音频应用程序,因为用户可以在后台继续收听我的应用程序音频音乐。【参考方案2】:

我建议你阅读clicking here的“Apple Human Interface”

在有限的情况下允许应用程序在后台运行,例如(音频、下载、更新..等),您可以在我提供给您的链接中找到所有内容。

【讨论】:

【参考方案3】:

使用它可以运行它的代码。

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/notification.wav", [[NSBundle mainBundle] resourcePath]]];

            NSError *error;

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

            AudioSessionInitialize( NULL, NULL, NULL,NULL);
            UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
            AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
            UInt32 value = YES;
            AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(value), &value);
            AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(value), &value);
            [[AVAudioSession sharedInstance] setActive: YES error: nil];
            AudioSessionSetActive(true);



            // self.appAudioPlayer=audioPlayer;
             AVAudioPlayer  *audioPlayer101 = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
            self.audioPlayerForPlay.delegate = self;
            self.audioPlayerForPlay.numberOfLoops=-1;
            [self.audioPlayerForPlay prepareToPlay];
            UInt32 doChangeDefaultRoute = 1;
            AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);





            self.audioPlayerForPlay = audioPlayer101;
            [audioPlayer101 release];
            [self.audioPlayerForPlay play];

【讨论】:

我需要在哪里放置代码?介意给我解释一下?我对此有点模糊。谢谢你。 @Ankur

以上是关于IOS App不在后台运行的主要内容,如果未能解决你的问题,请参考以下文章

即使应用程序不在后台运行,如何让 iOS 应用程序执行一些代码?

iOS 应用程序不在后台运行 = YES - 我如何检查用户何时退出应用程序

iOS开发:后台运行以及保持程序在后台长时间运行

iOS保持App真后台运行

iOS后台运行任务

《转载》IOS高级开发~开机启动&无限后台运行&监听进程