首页 文章

iOS中的背景音频

提问于
浏览
2

我正在尝试构建一个iOS应用程序(iOS> 5.0) . 当用户设置的计时器结束时,它应该播放音乐文件 . 这是我的设置如果到目前为止做了什么:

  • 我用的是avplayer

  • 我在我的plist中将背景模式设置为"App plays Audio"

  • 在我的appDelegate中我有:

NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];

在歌曲播放之前

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
[[AVAudioSession sharedInstance] setActive:YES error:&sessionError];
  • 我通过“playerItemDidPlayToEnd”通知我的应用程序,停止播放器并告诉其他应用程序,例如music.app再次激活
_avPlayer = nil;
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:&sessionError];

这很好用 . 您可以在后台播放音乐应用 . 我的应用程序开始播放音乐应用消失的歌曲 . 播放我的歌曲,如果完成,音乐应用程序继续播放 . 但只要我的应用程序不在后台 .

在后台我得到错误:

错误域= NSOSStatusErrorDomain代码= 560161140“操作无法完成 . (OSStatus错误560161140.)”

是否有可能在背景中播放(在自定义事件上)和在f.e之间切换 . music.app和我的应用程序在后台是不可能的?

这是我的播放器型号的代码:http://pastie.org/4830995

2 回答

  • -1

    我认为您的问题可能与后台处理有关 . 您需要在app delegate上覆盖此功能 .

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
     __block UIBackgroundTaskIdentifier task = 0;
     task=[application beginBackgroundTaskWithExpirationHandler:^{
         NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]);
        [application endBackgroundTask:task];
        task=UIBackgroundTaskInvalid;
    }];
    
    }
    

    除非播放声音,否则您的应用程序将在6分钟后被杀死 . 如果您的用户设置超过6分钟的计时器,您可以做的是每5.5分钟播放一次非常响亮的声音以保持应用程序活着并开始新的后台任务 . 此外,你必须考虑很多事情不会在后台执行 . 我做了一些类似于你正在做的事情 . 我所做的是创建NSObject的自定义子类,处理音乐播放和应用程序到期的东西 . 因为很多功能和通知都不会在后台运行VC,所以它在我的代表中成为了一个强大的属性 .

    虽然如果你只是想播放声音,这可能不是最好的方法 . 也许只是发送本地通知会 .

    希望这有帮助 .

  • 0

    您是否注册了自己的应用以在后台继续作为音频应用运行?为此,请将 UIBackgroundModes 键添加到 Info.plist 文件并将其值设置为 audio .

相关问题