使用Swift5.2,Xcode11.4和iOS13.4,
我尝试在将来的某个时间运行音频。
此外,该应用处于后台模式(并且该应用已完全关闭)。
必须设置音频会话以保持应用程序的响应速度,并且音频声音应在长达1年的延迟时间内开始。
我尝试过:
A)添加了“音频,AirPlay和画中画”背景模式:
B)AudioSession和AVAudioPlayer的配置如下:
import AVKit
var audioPlayer: AVAudioPlayer?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?)
-> Bool {
do {
//set up audio session
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playback, mode: .default, options: [.defaultToSpeaker, .duckOthers])
try audioSession.setActive(true)
// Start AVAudioPlayer
try audioPlayer = AVAudioPlayer(contentsOf: alertSound)
audioPlayer!.numberOfLoops = -1 // play endlessly
audioPlayer!.prepareToPlay()
let currentAudioTime = audioPlayer!.deviceCurrentTime
let delayTime: TimeInterval = 20.0 // here as an example, we use 20 seconds delay
audioPlayer!.play(atTime: currentAudioTime + delayTime) // delayTime is the time after which the audio will start
}
catch {
print(error)
}
return true
}
。
上面的代码有两个问题:
会话类别.playback
确实导致错误Error Domain=NSOSStatusErrorDomain Code=-50 "(null)"
仅当App在前景中或在应用程序静止时在后台播放声音-不幸的是,在应用程序完全关闭的背景中不会播放声音
这是我的问题:
为什么在iOS13.4下无法使用会话类别.playback
?
为什么在应用程序完全关闭时无法播放声音? (背景模式)???
仅设置背景模式标签“音频,AirPlay和画中画”就足够了吗?还是需要一些代码才能完全实现后台模式?为了使声音在完全封闭的应用程序中崭露头角,代码中是否缺少某些内容?
关于问题1:
->我找到了一种解决方法,并将会话类别设置为.playAndRecored
-之后错误消失了
try audioSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .duckOthers])
问题仍然存在:.playback为什么不起作用? .playback
和.playAndRecord
有什么区别?
答案 0 :(得分:1)
- 为什么session-category .playback在iOS13.4下不起作用?
.defaultToSpeaker
选项与.playback
一起使用时会导致该错误。我不知道为什么如果将其删除,它应该可以工作。
- 为什么在应用程序完全关闭时无法播放声音? (背景模式)???
当应用被终止时,音频会话也将终止。如果要播放超出应用程序寿命的声音,则需要使用远程通知。请参阅本文中有关构建闹钟应用的“推送通知方法”:
http://andrewmarinov.com/building-an-alarm-app-on-ios/
请注意,此方法存在一些局限性,主要是它要求用户在警报时上互联网才能正常工作。除了发送简单的本地通知(它在声音播放方面有其局限性,并且由硬件静音开关将其静音)之外,这是在应用程序的生命周期之外设置警报的当前方法。
该链接中还有其他方法可以使您的应用保持打开状态,但是会通知用户(保持麦克风始终打开或订阅频繁的位置更新)。
- 仅设置背景模式标签“音频,AirPlay和画中画”是否足够?还是需要一些代码才能完全实现后台模式?为了使声音在完全封闭的应用程序中崭露头角,代码中是否缺少某些内容?
此后台模式可防止您的应用在进行有效的音频会话时被挂起。它不会阻止您的应用被杀死。一旦终止,您的应用程序将无法播放,直到再次打开它。