You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:24:04