Swift 4中如何按顺序执行操作:先播放音频再打开网页
解决音频播放完成后再打开网页的问题
嘿,我来帮你搞定这个问题!你当前的代码里,audioPlayer.play()是异步执行的——也就是说,它刚启动播放就立刻跑去执行后面打开网页的代码了,这才导致两个操作同时发生。要实现先完成音频播放再打开网页,我们需要利用AVAudioPlayer的代理回调来监听播放完成的事件,具体步骤如下:
步骤1:让ViewController遵循AVAudioPlayerDelegate协议
首先,在你的ViewController类声明里添加协议,这样才能接收音频播放状态的回调:
class YourViewController: UIViewController, AVAudioPlayerDelegate { // 你的其他代码... var audioPlayer: AVAudioPlayer? }
步骤2:设置AudioPlayer的代理并优化初始化逻辑
在初始化audioPlayer的时候,把它的delegate设置为self,同时优化文件路径的获取逻辑,避免强制解包的风险:
@IBAction func webButton(_ sender: UIButton) { guard let audioPath = Bundle.main.path(forResource: "Basmalah", ofType: "mp3"), let audioURL = URL(fileURLWithPath: audioPath) else { print("无法找到指定的音频文件") // 如果播放失败也想打开网页,可以在这里添加打开网页的代码 openTargetWebPage() return } do { audioPlayer = try AVAudioPlayer(contentsOf: audioURL) audioPlayer?.delegate = self // 关键:设置代理以监听播放完成事件 audioPlayer?.prepareToPlay() audioPlayer?.play() } catch { print("加载音频文件出错:\(error.localizedDescription)") // 播放失败时的可选处理:直接打开网页 openTargetWebPage() } }
步骤3:实现播放完成的代理方法
添加AVAudioPlayerDelegate的回调方法,当音频播放完成(或播放失败)时,在这里执行打开网页的操作:
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { if flag { print("音频播放完成,准备打开网页") openTargetWebPage() } else { print("音频播放失败") // 如果播放失败也想打开网页,取消下面的注释即可 // openTargetWebPage() } } // 把打开网页的逻辑抽成单独方法,方便复用 private func openTargetWebPage() { guard let url = URL(string: "http://donate.edialoguec.com/campaign/details/63") else { print("目标URL无效") return } UIApplication.shared.open(url, options: [:]) }
为什么这样做?
AVAudioPlayerDelegate的audioPlayerDidFinishPlaying方法会在音频播放完成(或播放终止)时被触发,这就保证了打开网页的操作一定会在音频播放结束后才执行。- 抽离打开网页的方法后,不管是播放成功还是失败的场景,都能灵活复用这段逻辑,代码也更整洁。
内容的提问来源于stack exchange,提问作者Sulaiman Alammar
相关产品推荐
相关产品推荐

