0

这就像“谷歌地图”在后台导航。

我已经将“应用程序播放音频”添加到“所需的背景模式”中,但它不起作用。它出什么问题了?

这是示例源代码:

-(void)applicationDidEnterBackground:(UIApplication *)application
{
UIDevice* device = [UIDevice currentDevice];

BOOL backgroundSupported = NO;

if ([device respondsToSelector:@selector(isMultitaskingSupported)])
{
    backgroundSupported = device.multitaskingSupported;
}
if (backgroundSupported && _bgTask==UIBackgroundTaskInvalid )
{
    UIApplication*    app = [UIApplication sharedApplication];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        while (app.applicationState==UIApplicationStateBackground && _bgTask!=UIBackgroundTaskInvalid)
        {
            [NSThread sleepForTimeInterval:3];
            [self playAudio];
        }

        [app endBackgroundTask:_bgTask];
        _bgTask = UIBackgroundTaskInvalid;
    });
}
}

-(void)playAudio {
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
        [[AVAudioSession sharedInstance] setActive: YES error: nil];  

NSURL *audioFileLocationURL = [[NSBundle mainBundle] URLForResource:@"sound" withExtension:@"caf"];
NSError *error;
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileLocationURL error:&error];
[self.audioPlayer setNumberOfLoops:-1];
self.audioPlayer.delegate = self;
 [self.audioPlayer prepareToPlay];
[self.audioPlayer play];
}

音频文件的 url 可能来自网络,并且会在队列中播放多个音频文件。

4

1 回答 1

0

来自Apple关于该主题的文档

因为您在 applicationDidEnterBackground: 中启动的任何后台任务很可能在该方法退出之前不会运行,因此您应该在启动这些任务之前请求额外的后台执行时间。换句话说,首先调用 beginBackgroundTaskWithExpirationHandler: 然后在调度队列或辅助线程上运行任务。

根据我自己播放背景音频的经验,如果您不要求额外的时间,则需要事先进行设置,这[self.audioPlayer play]实际上是 中的第一行代码applicationDidEnterBackground,否则系统会在音频有机会启动之前暂停应用程序并保持清醒。

于 2013-04-28T09:38:57.660 回答