播放声音资源失败的问题处理

总结一下遇到的问题

1. 只能听到几秒

AVAudioPlayer 应该是一个全局变量, 可以使用单例模式在 App 内使用同一个对象来播放. 如果使用局部变量,会在退出函数范围后,The automated memory management (ARC) 会自动将其清理, 结果就会只能听到短暂的几秒或者干脆没有反应.

2. 找不到资源

要确保该资源已经在"Copy Bundle Resources"中

如上图中的 mp3文件在放到 Supporting Files 下后在"Copy Bundle Resources"中会自动添加, 但另一个 sms05.caf 却没有,需要手动添加.不知道为什么..

可以使用的代码:

import AVFoundation

class SoundPlayer {
    class var sharedInstance : SoundPlayer {
        struct Static {
            static let instance : SoundPlayer = SoundPlayer()
        }
        return Static.instance
    }

    var audioPlayer = AVAudioPlayer()
    var soundURL : NSURL?
    //let soundURL = NSURL(string:"/System/Library/Audio/UISounds/sms-received1.caf") // Working too

    init() {
        AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, error: nil)
        AVAudioSession.sharedInstance().setActive(true, error: nil)
    }

    private func initPlayer(name: String, ofType: String) {
        var error:NSError?
        soundURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(name, ofType: ofType)!)
        audioPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: &error)

        if (error != nil) {
            println("[SoundPlayer] There was an error: \(error)")
        }else {
           audioPlayer.prepareToPlay()
        }
    }

    /**
    播放声音

    :param: name 资源名称
    :param: ofType 资源类型
    */
    func playSound(name: String, ofType: String) {
        initPlayer(name, ofType: ofType)
        if (audioPlayer.playing) {
            audioPlayer.stop()
        }
        audioPlayer.play()
    }

    func stopPlay() {
        audioPlayer.stop()
    }
}
2015-07-25 16:323