Swift 3 - 在闪屏上播放声音时出错

Swift 3 - Error while playing sound on splashscreen

我在 Xcode 8,Swift 3.

我正在尝试编写代码以在应用程序启动后立即播放声音。我将它放入函数中(在 AppDelegate 中):

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {}

所以这是我的代码:

var opening_sound = AVAudioPlayer()

及之后:

let Nt = URL(fileURLWithPath: Bundle.main.path(forResource: "opp", ofType: "mp3")!)
        do {
            opening_sound = try AVAudioPlayer(contentsOf: Nt)
            opening_sound.prepareToPlay()

        } catch {print("Error")}

        opening_sound.play()

我当然导入AVFundation了。

当 运行ning 我进入控制台 "Error" 然后在行 opening_sound.play() 我得到“线程 1: EXC_BAD_ACCESS (code=1, address= 0x48 ).

我尝试 运行激活僵尸对象但没有答案。

编辑: 感谢您的回答。回复@silicon_valley :

我得到的错误是操作无法完成。 (操作系统状态错误 1685348671。)

我刚刚也有 : objc[31817]: Class _NSZombie___NSArrayM 都实现了 ?? (0x618000047c80) 和 ?? (0x618000047cb0)。将使用两者之一。哪一个是未定义的。允许僵尸。

我试过你说的@Pierce 但它不起作用,因为 AVAudioplayer 不能是可选值。如果我写 ... = AVAudioplayer?,我可以在 AVAudioplayer?() 和 "Cannot invoke initialiser for type 'AVAudioPlayer?' with no argument" 之间进行选择。或者如果我写 AVAudioPlayer?.self 之后的代码 运行 不正确。

所以,假设我可以将 opening_sound 作为可选值启动:

if let Nt = Nt {
    self.opening_sound = try? AVAudioPlayer(contentsOf: Nt)
}

不起作用,代码也是如此。

我认为问题出在处理主线程上,但我看不到。当然 "opp.mp3" 在主包中。

编辑:感谢@Pierce 的回答(抱歉,我没有正确阅读)我得到了这个:

var opening_sound: AVAudioPlayer?

...

let Nt: URL? = URL(fileURLWithPath: (Bundle.main.path(forResource: "opp", ofType: "mp3"))!)
        if let Nt = Nt {
            self.opening_sound = try? AVAudioPlayer(contentsOf: Nt)
        }

        playOpeningSound()

...

 func playOpeningSound() {
        if let opening_sound = opening_sound {
            if opening_sound.isPlaying {
                opening_sound.pause()
            }
            opening_sound.currentTime = 0
            DispatchQueue.global().async {
                opening_sound.play()
            }

        }

而且我没有错误。但是没有声音出来...! 感谢您的帮助 !

我发现播放歌曲的最佳方式是异步播放。 prepareToPlay 对我来说似乎从来没有正常工作过,它也没有解决第一次播放 UI 时导致暂停的问题。尝试与此类似的操作:

实例化AVAudioPlayer,使opening_sound可选

var opening_sound: AVAudioPlayer?

let Nt:URL? = URL(fileURLWithPath: Bundle.main.path(forResource: "opp", ofType: "mp3")!)
if let Nt = Nt {
    do {
      self.opening_sound = try AVAudioPlayer(contentsOf: Nt)
       } catch { 
          print(error) 
       }
}

playOpeningSound()

播放声音方法:

func playOpeningSound() {
    if let opening_sound = opening_sound {
        if opening_sound.isPlaying {
            opening_sound.pause()
        }
        opening_sound.currentTime = 0
        DispatchQueue.global().async {
            opening_sound.play()
            print("Sound should be playing")
        }
    }
}