gpt4 book ai didi

iphone - iOS4进入后台播放音频

转载 作者:行者123 更新时间:2023-12-03 18:20:42 26 4
gpt4 key购买 nike

当谈到在后台播放音频时,文档写得相当糟糕。它给人的印象是,要继续播放当前正在播放的音频,您只需向 info.plist 文件添加一个键/值对即可,wallah,这太神奇了。

然而,事实并非如此。例如,如果我播放 2 分钟长的 mp3,显然音频足够长,可以在我按下主页按钮将应用程序发送到后台后播放。问题是,即使我的 info.plist 文件中有该键/值对,它也会暂停音频,然后在我切换回应用程序后继续播放。

Apple 声明所有音频框架都支持背景,并且声音应继续播放直至结束,然后 Apple 将暂停您的应用程序。

所以,我的问题是:他们在做什么而我错过了?我是否还必须以某种方式使用他们的新委托(delegate)或在 applicationDidEnterBackground 上调用音频?对我来说,这没有意义,因为我没有保存状态(它们通过快速应用程序切换为我做)或真正处理后台中的任何内容,而不是他们所说的应该自动处理的音频。

最佳答案

您还需要在开始播放歌曲之前调用 beginBackgroundTaskWithExpirationHandler: (无论是否在前台,始终执行此操作),并在歌曲结束时调用 endBackgroundTask。

这告诉 iOS,即使您的应用程序被置于后台,您也希望能够继续处理。它不会创建新的任务或线程,它只是向 iOS 发出一个您想要继续运行的标志。如果没有这个,音频将播放完成,但是当它完成时,如果您想开始另一个轨道,您必须能够在后台运行。

你可以像这样使用它:

// ivar, initialized to UIBackgroundTaskInvalid in awakeFromNib
UIBackgroundTaskIdentifier bgTaskId;

启动音频播放器时,我们保存背景任务 ID:

if ([audioPlayer play]) {
bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
}

现在,audioPlayerDidFinishPlaying: 回调仍然会发生,因为我们已经告诉 iOS,我们正在执行一项即使我们被置于后台也需要继续的任务。这样我们就可以得到回调并开始下一个音频文件。

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)success
{
UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;

if (self.haveMoreAudioToPlay) {
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
[self playNextAudioFile];
}

if (bgTaskId != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
}

bgTaskId = newTaskId;
}

关于iphone - iOS4进入后台播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3161635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com