在特定时间在后台播放音频

时间:2020-05-20 11:08:08

标签: swift avaudioplayer avaudiosession avkit background-mode

使用Swift5.2,Xcode11.4和iOS13.4,

我尝试在将来的某个时间运行音频。

此外,该应用处于后台模式(并且该应用已完全关闭)。

必须设置音频会话以保持应用程序的响应速度,并且音频声音应在长达1年的延迟时间内开始。

我尝试过:

A)添加了“音频,AirPlay和画中画”背景模式:

enter image description here

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
}

上面的代码有两个问题:

  1. 会话类别.playback确实导致错误Error Domain=NSOSStatusErrorDomain Code=-50 "(null)"

  2. 仅当App在前景中或在应用程序静止时在后台播放声音-不幸的是,在应用程序完全关闭的背景中不会播放声音

这是我的问题:

  1. 为什么在iOS13.4下无法使用会话类别.playback

  2. 为什么在应用程序完全关闭时无法播放声音? (背景模式)???

  3. 仅设置背景模式标签“音频,AirPlay和画中画”就足够了吗?还是需要一些代码才能完全实现后台模式?为了使声音在完全封闭的应用程序中崭露头角,代码中是否缺少某些内容?

关于问题1:

->我找到了一种解决方法,并将会话类别设置为.playAndRecored-之后错误消失了

try audioSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .duckOthers])

问题仍然存在:.playback为什么不起作用? .playback.playAndRecord有什么区别?

1 个答案:

答案 0 :(得分:1)

  1. 为什么session-category .playback在iOS13.4下不起作用?

.defaultToSpeaker选项与.playback一起使用时会导致该错误。我不知道为什么如果将其删除,它应该可以工作。

  1. 为什么在应用程序完全关闭时无法播放声音? (背景模式)???

当应用被终止时,音频会话也将终止。如果要播放超出应用程序寿命的声音,则需要使用远程通知。请参阅本文中有关构建闹钟应用的“推送通知方法”:

http://andrewmarinov.com/building-an-alarm-app-on-ios/

请注意,此方法存在一些局限性,主要是它要求用户在警报时上互联网才能正常工作。除了发送简单的本地通知(它在声音播放方面有其局限性,并且由硬件静音开关将其静音)之外,这是在应用程序的生命周期之外设置警报的当前方法。

该链接中还有其他方法可以使您的应用保持打开状态,但是会通知用户(保持麦克风始终打开或订阅频繁的位置更新)。

  1. 仅设置背景模式标签“音频,AirPlay和画中画”是否足够?还是需要一些代码才能完全实现后台模式?为了使声音在完全封闭的应用程序中崭露头角,代码中是否缺少某些内容?

此后台模式可防止您的应用在进行有效的音频会话时被挂起。它不会阻止您的应用被杀死。一旦终止,您的应用程序将无法播放,直到再次打开它。